Datenbank per UserForm füllen in intelligente Tabellen

  • Excel

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Gelöschter Benutzer.

    Datenbank per UserForm füllen in intelligente Tabellen

    Hallo,
    der neue hier :)

    Gleich vorweg: ich hab mir ein Mammutprojekt aufgehalst aber hoffe dennoch hier Hilfe zu finden. Nach etlichen versuchen mit google und YT komme ich langsam an die Grenzen meines Durchhaltevermögens.
    Ich habe ledigliche grundkenntnisse von VB aus dem jahr 2001...seitdem nie wieder irgendwas programmiert.

    Nun habe ich die Möglichkeit bekommen mich wieder damit beschäftigen zu dürfen und komme nicht weiter, da ich nicht einmal weiß wo ich anfangen soll.

    Folgender Stand:

    Ich habe eine Datenbank in Excel erstellt. ~83 fixe Spalten und n-Zeilen sollen per Userform (Welches exakt den gleichen aufbau wie die DB hat) gefüllt werden um die eingabe ein wenig zu vereinfachen(Da Daten der letzten 3-4Jahre nachgetragen werden sollen).
    Die Daten sind separat in einer intelligenten Tabelle wobei wiederum die Beschriftungen Doppelt vorhanden sind(bedingt durch Übersichtlichkeit und Verknüpfbarkeit)

    Nun bin ich soweit das das UserForm ordentlich erstellt, benannt und aufgebaut ist, es fehlt halt lediglich der Code ;)

    Benötigter Code:

    -Löschen button => eingegebene werte entfernen = Erledigt :thumbsup:
    -Schliessen button => :thumbsup:
    -Speichern button => :thumbdown:
    Wo fängt man an?

    Die Daten sollen in die intelligente Tabelle, in eine neue Zeile geschrieben werden. Verwendet werden textboxen, comboboxen und radiobuttons
    zusätzlich sollte natürlich geprüft werden ob:

    //----am wichtigsten da hier die meiste arbeit nötig ist....~12comboboxen !)
    A) Die einzelnen Textboxen/comboboxen gefüllt sind
    (bei den comboboxen soll der gewählte inhalt nicht in zellen GESCHRIEBEN werden, sondern soll nur mit dem Tabellen inhalt vergleichen und bei einem Treffer den daneben in der Textbox stehenden wert in die Spalte/zeile
    schreiben!)
    ---//
    B) Die Werte in der Tabelle eventuell schon vorhanden sind (gibt nur ein Eintrag = Chargen Nr. welcher immer einzigartig ist)

    Das alles ist eine REZEPT datenbank wodurch natürlich viele leere Zellen quasi üblich sind.

    Ich bin bisher soweit gekommen das ich es geschafft habe eine neue Zeile der intelligenten Tabelle hinzu zu fügen und die ersten 4 fixen werte einzutragen... allerdings bin ich nun an dem Punkt, wo ich keinen Plan habe wie und wo ich am besten weiter mache,
    da meine Kenntnisse hier aufhören.

    Aus gründen der "Vertraulichkeit" kann ich die Datei nicht hochladen, daher nur Screenshots.
    Den Code kann ich natürlich jederzeit einfügen, wenn erwünscht.

    Ich hoffe echt auf hilfe^^

    mfg Eni
    Bilder
    • Screenshot_1.png

      20,29 kB, 1.148×266, 2.330 mal angesehen
    • Screenshot_2.png

      41,05 kB, 782×735, 3.382 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gelöschter Benutzer“ ()

    Also zum Hinzufügen:
    Als erstes Benötigst du alle Daten aus deinem Formular, sodass du diese direkt als Row in deine Tabelle einfügen kannst. bspw. so.

    Um zu überprüfen, ob bereits ein Datensatz mit Chargen-Nr. XYZ besteht, genügte eine einfach if. siehe hier.

    Deine Anforderung mit der Combo-/Textbox kann ich noch nicht ganz verstehen, solte aber bereits mit beim ersten Punkt, dem Zusammentragen der Daten, mit geschehen und die User-Eingaben auswerten und je nachdem deine neue Row zusammenbauen.

    So grob die Vorgehensweise. Kannst du dir mal anschauen und ggf. spezifischere Fragen stellen.

    LG Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Erstmal danke für die Antwort+Hilfe. :)


    Zu dem Punkt für die neue Zeile: das hab ich schon integriert, allerdings auf anderem wege und wahrscheinlich nicht optimiert, da selbst wenn mein formular komplett leer ist, erstellt es beim "speichern" klicken dennoch eine leere neue Zeile.. ist an sich nicht weiter tragisch, denn eine abfrage das alles leer ist, und eine warnung kommt sollte nicht so schwer sein ...hoff ich :D

    Der ganze Code sieht bisher so aus:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub UserForm_Initialize()
    2. With Me
    3. '-----------Sonoflotauswahl Voreinstellung laden
    4. .opt_frisch.Value = True
    5. .opt_dick1.Value = True
    6. .opt_ja.Value = True
    7. .opt_giluton.Value = True
    8. '-----------Dropdown Auswahl Rohstoffe laden
    9. .cb_rs_1.List = Range("Rohstoffe").Value
    10. .cb_rs_2.List = Range("Rohstoffe").Value
    11. .cb_rs_3.List = Range("Rohstoffe").Value
    12. .cb_rs_4.List = Range("Rohstoffe").Value
    13. '-----------Dropdown Auswahl Altpapiere laden
    14. .cb_ap_1.List = Range("APGruppen").Value
    15. .cb_ap_2.List = Range("APGruppen").Value
    16. .cb_ap_3.List = Range("APGruppen").Value
    17. .cb_ap_4.List = Range("APGruppen").Value
    18. .cb_ap_5.List = Range("APGruppen").Value
    19. .cb_ap_6.List = Range("APGruppen").Value
    20. .cb_ap_7.List = Range("APGruppen").Value
    21. .cb_ap_8.List = Range("APGruppen").Value
    22. '-----------Dropdown Auswahl Nassfest & Farben laden
    23. .cb_nass1.List = Range("nassfest").Value
    24. .cb_nass2.List = Range("nassfest").Value
    25. .cb_color1.List = Range("Farben").Value
    26. .cb_color2.List = Range("Farben").Value
    27. .cb_color3.List = Range("Farben").Value
    28. .cb_color4.List = Range("Farben").Value
    29. End With
    30. End Sub
    31. Private Sub btn_Speichern_Click()
    32. '-----------speichert die eingegebenen Werte in die nächste freie Zeile
    33. '-----------Wählt das Tabellenblatt "Rezeptverlauf" (Chronik) aus und fügt neue Zeile hinzu
    34. Dim Blatt As Worksheet
    35. Dim Chronik As ListObject
    36. Dim Zeile As ListRow
    37. Set Blatt = Sheets("Rezeptverlauf")
    38. Set Chronik = Blatt.ListObjects(1)
    39. Set Zeile = Chronik.ListRows.Add
    40. '-----------folgende Abschnitte schreiben die eingetragenen Werte in die neue Zeile der tab_chronik
    41. '-----------#1 Sortendaten Spalten 1 bis 4
    42. Zeile.Range(1, 1).Value = txt_box_artikel.Value
    43. Zeile.Range(1, 2).Value = txt_box_sorte.Value
    44. Zeile.Range(1, 3).Value = txt_box_gramm.Value
    45. Zeile.Range(1, 4).Value = txt_box_charge.Value
    46. '-----------#2 Rohstoffdaten - noch nicht DYNAMISCH! Spalten 7 bis 20
    47. Zeile.Range(1, 7).Value = txt_rs_1.Value
    48. Zeile.Range(1, 8).Value = txt_rs_2.Value
    49. Zeile.Range(1, 9).Value = txt_rs_3.Value
    50. Zeile.Range(1, 10).Value = txt_rs_4.Value
    51. '-----------#4 Altpapierdaten - noch nicht dynamisch Spalten 22 bis 39
    52. Zeile.Range(1, 22).Value = txt_ap_1.Value
    53. Zeile.Range(1, 23).Value = txt_ap_2.Value
    54. Zeile.Range(1, 24).Value = txt_ap_3.Value
    55. Zeile.Range(1, 25).Value = txt_ap_4.Value
    56. Zeile.Range(1, 26).Value = txt_ap_5.Value
    57. Zeile.Range(1, 27).Value = txt_ap_6.Value
    58. Zeile.Range(1, 28).Value = txt_ap_7.Value
    59. Zeile.Range(1, 29).Value = txt_ap_8.Value
    60. '-----------#5 Bemerkungen hinzufügen
    61. Zeile.Range(1, 83).Value = txt_bemerkung.Value
    62. '-----------#6 Sonoflotdaten
    63. If opt_poly.Value = True Then
    64. Zeile.Range(1, 77) = "x"
    65. Zeile.Range(1, 76) = "-"
    66. ElseIf opt_giluton.Value = True Then
    67. Zeile.Range(1, 76) = "x"
    68. Zeile.Range(1, 77) = "-"
    69. End If
    70. If opt_dick1.Value = True Then
    71. Zeile.Range(1, 78) = "x"
    72. Zeile.Range(1, 79) = "-"
    73. ElseIf opt_dick2.Value = True Then
    74. Zeile.Range(1, 79) = "x"
    75. Zeile.Range(1, 78) = "-"
    76. End If
    77. If opt_ja.Value = True Then
    78. Zeile.Range(1, 80) = "x"
    79. Zeile.Range(1, 81) = "-"
    80. ElseIf opt_nein.Value = True Then
    81. Zeile.Range(1, 81) = "x"
    82. Zeile.Range(1, 80) = "-"
    83. End If
    84. '-----------#7 Wasser
    85. Zeile.Range(1, 70).Value = txt_ansatz.Value
    86. Zeile.Range(1, 71).Value = txt_fuellen.Value
    87. If opt_frisch.Value = True Then
    88. Zeile.Range(1, 67) = "x"
    89. Zeile.Range(1, 68) = "-"
    90. Zeile.Range(1, 69) = "-"
    91. ElseIf opt_rueck.Value = True Then
    92. Zeile.Range(1, 68) = "x"
    93. Zeile.Range(1, 69) = "-"
    94. Zeile.Range(1, 67) = "-"
    95. ElseIf opt_deio.Value = True Then
    96. Zeile.Range(1, 69) = "x"
    97. Zeile.Range(1, 67) = "-"
    98. Zeile.Range(1, 68) = "-"
    99. End If
    100. '-----------#8 Mahlung Spalte 41 bis 48
    101. Zeile.Range(1, 41) = txt_entstipper.Value
    102. Zeile.Range(1, 42) = txt_stippen.Value
    103. Zeile.Range(1, 43) = txt_ref1.Value
    104. Zeile.Range(1, 44) = txt_ref2.Value
    105. Zeile.Range(1, 45) = txt_ref3.Value
    106. Zeile.Range(1, 46) = txt_ref4.Value
    107. Zeile.Range(1, 47) = txt_mahl.Value
    108. Zeile.Range(1, 48) = txt_df.Value
    109. End Sub
    110. Private Sub btn_schliessen_Click()
    111. '-----------Schliesst die Eingabemaske ohne Prüfung
    112. Unload Me
    113. End Sub
    114. Private Sub btn_löschen_Click()
    115. 'leert alle vorhandenen Eingabefelder
    116. '-----------------------------Sortenangaben---------------------------
    117. txt_box_artikel = ""
    118. txt_box_sorte = ""
    119. txt_box_gramm = ""
    120. txt_box_charge = ""
    121. '----------------------------Rohstoffe Kilo---------------------------
    122. txt_rs_1 = ""
    123. txt_rs_2 = ""
    124. txt_rs_3 = ""
    125. txt_rs_4 = ""
    126. '----------------------------AP Kilo----------------------------------
    127. txt_ap_1 = ""
    128. txt_ap_2 = ""
    129. txt_ap_3 = ""
    130. txt_ap_4 = ""
    131. txt_ap_5 = ""
    132. txt_ap_6 = ""
    133. txt_ap_7 = ""
    134. txt_ap_8 = ""
    135. '----------------------------Rohstoffe&APdropdowns--------------------
    136. cb_rs_1 = ""
    137. cb_rs_2 = ""
    138. cb_rs_3 = ""
    139. cb_rs_4 = ""
    140. cb_ap_1 = ""
    141. cb_ap_2 = ""
    142. cb_ap_3 = ""
    143. cb_ap_4 = ""
    144. cb_ap_5 = ""
    145. cb_ap_6 = ""
    146. cb_ap_7 = ""
    147. cb_ap_8 = ""
    148. '-------------------------------Bemerkungen---------------------------
    149. txt_bemerkung = ""
    150. '-------------------------------Zusätze-------------------------------
    151. cb_nass1 = ""
    152. cb_nass2 = ""
    153. cb_color1 = ""
    154. cb_color2 = ""
    155. cb_color3 = ""
    156. cb_color4 = ""
    157. txt_nass1 = ""
    158. txt_nass2 = ""
    159. txt_color1 = ""
    160. txt_color2 = ""
    161. txt_color3 = ""
    162. txt_color4 = ""
    163. '---------------------------------Mahlung------------------------------
    164. txt_entstipper = ""
    165. txt_stippen = ""
    166. txt_ref1 = ""
    167. txt_ref2 = ""
    168. txt_ref3 = ""
    169. txt_ref4 = ""
    170. '---------------------------------Wasser-------------------------------
    171. txt_ansatz = ""
    172. txt_fuellen = ""
    173. '---------------------------------Sonoflot-----------------------------
    174. '----------------------------------------------------------------------
    175. End Sub


    ist meiner Meinung nach recht simpel und statisch gestrickt, da ich leider nicht weiß ob es da "einfachere" Methoden gibt.

    Zu dem punkt Comboboxen nochmal ausführlicher:

    Die Comboboxen enthalten Namen, welche den exakt gleichen namen in der Datenbank haben, dort aber in Spalten stehen.
    Wählt man nun in der ersten Combobox einen Namen und schreibt in das daneben liegende Textfeld einen Wert, soll in der DB die Spalte gesucht werden wo der in der Combobox gewählte NAME steht (also vergleichen) und in die Zelle (in der neu angelegten Zeile) den Wert eintragen, aber eben nicht den Namen der in der Combobox gewählt wurde. Die Combobox soll halt lediglich als Orientierung dienen, wo der Wert aus dem rechts danebenliegenden Textfeld hinein geschrieben werden soll.

    Dies ist auch bisher der Punkt, wo ich noch keinen Ansatz für gefunden habe, wie ich das Syntaxmäßig angehe ^^, da mir die Kenntnisse fehlen was wo wann genutzt wird :P

    Falls Fehler enthalten oder Verbesserungen (Vereinfachung) vom Code möglich/nötig sind, ich bin offen für alles. Ich werde zu gegebener Zeit mal deine Links versuchen einzubauen und probieren, daher kann ich noch nicht sagen ob es dem entspricht was ich dachte.

    danke nochmals,

    mfg eni
    Also, das lässt sich logischerweise durch Schleifen etc. vereinfachen und verschönern.

    Beispiele:

    Komplettes Formular zurücksetzen, einfach über Foreach Control. Wenn du weitere Controltypen später verwendest, einfach die IF erweitern

    Visual Basic-Quellcode

    1. Function clearControls()
    2. For Each ctrl In Me.Controls
    3. If TypeName(ctrl) = "TextBox" Or TypeName(ctrl) = "ComboBox" Then
    4. ctrl.Value = ""
    5. ctrl.Text = ""
    6. End If
    7. Next
    8. End Function


    Dann das erstellen der Zeile:
    Mach dir ein Array, in dem du alle ctrl-Namen abspeicherst.
    Dann musst nur dadurch iterieren und den Wert auslesen. Das Array besitzt zu jeden Namen einen Index, der deine Column des Zeilen.Range entspricht.

    Visual Basic-Quellcode

    1. Function getRowFromForm()
    2. Dim mappingmapping = Array("TextBox1", "TextBox2")
    3. For i = 0 To UBound(mapping)
    4. ctrlName = mapping(i)
    5. MsgBox Me.Controls(ctrlName).Value
    6. 'Zeile.Range(1, i + 1).Value = mapping(i).Value
    7. Next
    8. End Function


    probier damit ein wenig rum ,dann wird das viel übersichtlicher.

    Wie du überprüfen kannst, ob alle Controls leer sind?

    Bspw. einen Counter in der getRowFromForm - Funktion. Wenn der Counter > X ist, sind zu wenig Angaben da und es wird nicht gespeichert.
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:

    Gelöschter Benutzer schrieb:

    Die Comboboxen enthalten Namen, welche den exakt gleichen namen in der Datenbank haben, dort aber in Spalten stehen.
    Wählt man nun in der ersten Combobox einen Namen und schreibt in das daneben liegende Textfeld einen Wert, soll in der DB die Spalte gesucht werden wo der in der Combobox gewählte NAME steht (also vergleichen) und in die Zelle (in der neu angelegten Zeile) den Wert eintragen, aber eben nicht den Namen der in der Combobox gewählt wurde. Die Combobox soll halt lediglich als Orientierung dienen, wo der Wert aus dem rechts danebenliegenden Textfeld hinein geschrieben werden soll.




    Wozu dann die Combobox? Die regelt ja offensichtlich in keinster Weise den Wert des eigentlichen Textfeldes, oder?
    Werden die Werte von Textbox und dem bei der Combobox selektierten Wert in der Datenbank verglichen? Wozu?

    angenommen man selektiert in ComboboxXY den Wert A, ändert sich dann auch das Textfeld?



    LG Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Nun der Hauptgrund ist Platzmangel.

    Würde ich keine dropdowns verwenden, müsste ich für jede "MÖGLICHE" Eingabe, ein textfeld auf das form packen, das wären dann zusätzlich zu den vorhandenen nochmal 36+!
    Da es sich ja um eine "Rezept"-datenbank handelt, und nicht jede Zutat bei jedem Rezept enthalten ist (aber eventuell sein könnte) müssen alle zutaten in die DB. würde ich textfelder pro zutat einbauen könnte ich mir eigentlich auch dieses formular sparen und es händisch in die DB eintippen. Aber ich bin nicht derjenige der die DB immer pflegen wird ;) daher bin ich auf "benutzerfreundlich" eingestellt, um es anderen (die vll mit EXCEL nicht so klar kommen....ältere leute halt :P) leichter zu machen.

    Daher wie oben in screenshot_2 nur 4 dropdowns für rohstoffe ( da pro rezept selten bis nie mehr als 4 zum einsatz kommen) und bei altpapier eben 8 (was auch sehr großzügig ist) eingebaut, unter welchen man die eigentlichen
    Zutaten findet.

    Wenn es eine bessere Möglichkeit gibt, den wert in die dafür vorgesehene Spalte zu schreiben , nur her damit :D bin offen für alles was mir arbeit und unnötigen aufwand erspart.


    Hier nochmal ein beispiel was es eventuell besser veranschaulicht:
    Bilder
    • Screenshot_3.png

      28,69 kB, 1.056×265, 1.936 mal angesehen
    Wie schaut es aus mit Tooltip? Wäre das etwas für dein Vorhaben? Beim Hovern wird der Text angezeigt, in deinem Fall eben der Text, mit dem du normal die Comboboxen füllst.
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    ne ich glaub du verkennst den zweck den ich ehm....bezwecke:

    Beispiel:

    Ich wähle in combobox1 eintrag 1 der enthaltenen liste...dann schreib ich daneben einen wert in ein textfeld1. Beim speichern, muss dann das programm in der datenbank schauen, wo steht der eintrag1 aus der combobox1 und muss dann den wert aus textfeld1 dort in die zelle schreiben.
    habe ich aber eintrag 2 gewählt, muss der wert aus textfeld1 eben in die spalte für den eintrag2 :/ und da hängts, denn ich weiss A) nicht ob das überhaupt möglich ist, wie ich das hier mir vorstelle oder B) ob es eine andere, bessere möglichkeit gibt.
    Eine idee die ich letztens noch hatte wäre anstatt combobox, eine listbox zu nehmen, wo dann die auswahl aus der listbox bestimmt, wo der inhalt aus dem danebenliegenen wert hinsoll...allerdings bräucht ich dann auch mehrere listboxen ...da reicht nicht 2 oder 3....
    So wie du das definierst, hast du ein paar Comboboxen, deren Werte der Textbox sich je nach Combobox-wert in eine andere Spalte der End-Tabelle speichern.
    Dafür fällt mir gerade kein einfacher Weg ein, außer vllt. wenn du deine Combobox befüllst, dass jedes Element eine Wert (Zahl) hat, der dem Index in deinem mapping-Array entspricht.

    Somit kannst du beim speichern schauen, was hab ich für ein Element und wohin muss ich es speichern. Nur so als Idee....

    Wie klappt es mit dem Rest?


    LG Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    sieh vorheriger Post :P

    Da ich die woche nachtschicht habe und nur "nebenbei" daran arbeiten kann komm ich halt nur sehr schleppend vorran + ohne inet @ work macht das ganze schwierig noch irgendwas nach zu lesen ....
    Ich werde mal sehen ob ich die woche dazu komme mich mit den functions mal zu beschäftigen, aber ich bin da nich so optimistisch ^^


    EDIT:
    Also ich hab es versucht aber irgendwie nicht durchgestiegen (werd wohl zu alt).
    Deshalb hab ich mich erst einmal dazu entschieden alles in Textboxen umzubauen (siehe link) und diese wie vorher die anderen, jede einzeln abzuarbeiten:

    prntscr.com/f8q97r
    (irgendwie funzt hier im forum auch nicht das einbinden von bildern, oder bin ich nur unfähig? ?( )



    Des weiteren tue ich mich schwer mit dem einbauen von anderem code und dem löschen von meinem, da ich angst habe das der neue dann nich funktioniert und ich somit "garnix" mehr habe.
    Ich weiss z.b. nicht was control macht?! oder ubound? Arrays hab ich schonmal gehört...vor 17 jahren :D und fand die schon damals verwirrend.

    Das hauptproblem ist wohl das ich mich schwer in solche dinge reindenken kann, was denn was eigtl macht.
    Plus, das ich halt die ganzen möglichkeiten nicht kenne, mit welchen man sein ziel erreichen kann.

    Hier übrigens der nochmals aktuelle code...vll kannst du mir EIN beispiel einbauen? bzw. markieren WO ich WAS durch WAS ersetzen sollte? dann könnt ich mich da eventuell besser reinlesen :thumbsup:


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub AddDataRow(tableName As String, NewData As Variant)
    2. Dim sheet As Worksheet
    3. Dim table As ListObject
    4. Dim col As Integer
    5. Dim lastRow As Range
    6. Set sheet = Range("tab_chronik").Parent
    7. Set table = sheet.ListObjects.Item("tab_chronik")
    8. 'First check if the last row is empty; if not, add a row
    9. If table.ListRows.Count > 0 Then
    10. Set lastRow = table.ListRows(table.ListRows.Count).Range
    11. If Application.CountBlank(lastRow) < lastRow.Columns.Count Then
    12. table.ListRows.Add
    13. End If
    14. End If
    15. 'Iterate through the last row and populate it with the entries from values()
    16. If table.ListRows.Count = 0 Then 'If table is totally empty, set lastRow as first entry
    17. table.ListRows.Add Position:=1
    18. Set lastRow = table.ListRows(1).Range
    19. Else
    20. Set lastRow = table.ListRows(table.ListRows.Count).Range
    21. End If
    22. For col = 1 To lastRow.Columns.Count
    23. If col <= UBound(NewData) + 1 Then lastRow.Cells(1, col) = NewData(col - 1)
    24. Next col
    25. End Function
    26. Private Sub btn_Speichern_Click()
    27. '-----------speichert die eingegebenen Werte in die nächste freie Zeile
    28. '-----------Wählt das Tabellenblatt "Rezeptverlauf" (Chronik) aus und fügt neue Zeile hinzu
    29. Dim Blatt As Worksheet
    30. Dim Chronik As ListObject
    31. Dim Zeile As ListRow
    32. Set Blatt = Sheets("Rezeptverlauf")
    33. Set Chronik = Blatt.ListObjects(1)
    34. Set Zeile = Chronik.ListRows.Add
    35. '-----------folgende Abschnitte schreiben die eingetragenen Werte in die neue Zeile der tab_chronik
    36. '-----------#1 Sortendaten Spalten 1 bis 4
    37. Zeile.Range(1, 1).Value = txt_box_artikel.Value
    38. Zeile.Range(1, 2).Value = txt_box_sorte.Value
    39. Zeile.Range(1, 3).Value = txt_box_gramm.Value
    40. Zeile.Range(1, 4).Value = txt_box_charge.Value
    41. '-----------#2 Rohstoffdaten - noch nicht DYNAMISCH! Spalten 7 bis 20
    42. Zeile.Range(1, 7).Value = txt_rs1.Value
    43. Zeile.Range(1, 20).Value = txt_rs2.Value
    44. Zeile.Range(1, 17).Value = txt_rs3.Value
    45. Zeile.Range(1, 16).Value = txt_rs4.Value
    46. Zeile.Range(1, 14).Value = txt_rs5.Value
    47. Zeile.Range(1, 10).Value = txt_rs6.Value
    48. Zeile.Range(1, 11).Value = txt_rs7.Value
    49. Zeile.Range(1, 9).Value = txt_rs8.Value
    50. Zeile.Range(1, 13).Value = txt_rs9.Value
    51. Zeile.Range(1, 15).Value = txt_rs10.Value
    52. Zeile.Range(1, 12).Value = txt_rs11.Value
    53. Zeile.Range(1, 8).Value = txt_rs12.Value
    54. '-----------#4 Altpapierdaten - noch nicht dynamisch Spalten 22 bis 39
    55. Zeile.Range(1, 22).Value = txt_ap1.Value
    56. Zeile.Range(1, 23).Value = txt_ap2.Value
    57. Zeile.Range(1, 24).Value = txt_ap3.Value
    58. Zeile.Range(1, 25).Value = txt_ap4.Value
    59. Zeile.Range(1, 26).Value = txt_ap5.Value
    60. Zeile.Range(1, 27).Value = txt_ap6.Value
    61. Zeile.Range(1, 28).Value = txt_ap7.Value
    62. Zeile.Range(1, 29).Value = txt_ap8.Value
    63. Zeile.Range(1, 30).Value = txt_ap9.Value
    64. Zeile.Range(1, 31).Value = txt_ap10.Value
    65. Zeile.Range(1, 32).Value = txt_ap11.Value
    66. Zeile.Range(1, 33).Value = txt_ap12.Value
    67. Zeile.Range(1, 34).Value = txt_ap13.Value
    68. Zeile.Range(1, 35).Value = txt_ap14.Value
    69. Zeile.Range(1, 36).Value = txt_ap15.Value
    70. Zeile.Range(1, 37).Value = txt_ap16.Value
    71. Zeile.Range(1, 38).Value = txt_rfff.Value
    72. Zeile.Range(1, 39).Value = txt_apinfo.Value
    73. '-----------#5 Zusätze - noch nicht dynamisch! Spalten 50 bis 65
    74. Zeile.Range(1, 50).Value = txt_nass1.Value
    75. Zeile.Range(1, 51).Value = txt_nass2.Value
    76. Zeile.Range(1, 52).Value = txt_nass3.Value
    77. Zeile.Range(1, 54).Value = txt_color1.Value
    78. Zeile.Range(1, 59).Value = txt_color2.Value
    79. Zeile.Range(1, 62).Value = txt_color3.Value
    80. Zeile.Range(1, 55).Value = txt_color4.Value
    81. Zeile.Range(1, 60).Value = txt_color5.Value
    82. Zeile.Range(1, 58).Value = txt_color6.Value
    83. Zeile.Range(1, 63).Value = txt_color7.Value
    84. Zeile.Range(1, 64).Value = txt_color8.Value
    85. Zeile.Range(1, 56).Value = txt_color9.Value
    86. Zeile.Range(1, 57).Value = txt_color10.Value
    87. Zeile.Range(1, 61).Value = txt_color11.Value
    88. Zeile.Range(1, 65).Value = txt_naoh.Value
    89. '-----------#5 Bemerkungen hinzufügen Spalte 83
    90. Zeile.Range(1, 83).Value = txt_bemerkung.Value
    91. '-----------#6 Sonoflotdaten
    92. Zeile.Range(1, 74).Value = "x" 'mit
    93. Zeile.Range(1, 75).Value = "-" 'ohne
    94. If opt_poly.Value = True Then
    95. Zeile.Range(1, 77) = "x"
    96. Zeile.Range(1, 76) = "-"
    97. ElseIf opt_giluton.Value = True Then
    98. Zeile.Range(1, 76) = "x"
    99. Zeile.Range(1, 77) = "-"
    100. End If
    101. If opt_dick1.Value = True Then
    102. Zeile.Range(1, 78) = "x"
    103. Zeile.Range(1, 79) = "-"
    104. ElseIf opt_dick2.Value = True Then
    105. Zeile.Range(1, 79) = "x"
    106. Zeile.Range(1, 78) = "-"
    107. End If
    108. If opt_ja.Value = True Then
    109. Zeile.Range(1, 80) = "x"
    110. Zeile.Range(1, 81) = "-"
    111. ElseIf opt_nein.Value = True Then
    112. Zeile.Range(1, 81) = "x"
    113. Zeile.Range(1, 80) = "-"
    114. End If
    115. '-----------#7 Wasser Spalte 67 bis 71
    116. Zeile.Range(1, 70).Value = txt_ansatz.Value
    117. Zeile.Range(1, 71).Value = txt_fuellen.Value
    118. If opt_frisch.Value = True Then
    119. Zeile.Range(1, 67) = "x"
    120. Zeile.Range(1, 68) = "-"
    121. Zeile.Range(1, 69) = "-"
    122. ElseIf opt_rueck.Value = True Then
    123. Zeile.Range(1, 67) = "-"
    124. Zeile.Range(1, 68) = "x"
    125. Zeile.Range(1, 69) = "-"
    126. ElseIf opt_deio.Value = True Then
    127. Zeile.Range(1, 67) = "-"
    128. Zeile.Range(1, 68) = "-"
    129. Zeile.Range(1, 69) = "x"
    130. End If
    131. '-----------#8 Mahlung Spalte 41 bis 48
    132. Zeile.Range(1, 41) = txt_entstipper.Value
    133. If cb_stippen.Value = True Then
    134. Zeile.Range(1, 42) = "x"
    135. Else
    136. Zeile.Range(1, 42) = "-"
    137. End If
    138. Zeile.Range(1, 43) = txt_ref1.Value
    139. Zeile.Range(1, 44) = txt_ref2.Value
    140. Zeile.Range(1, 45) = txt_ref3.Value
    141. Zeile.Range(1, 46) = txt_ref4.Value
    142. Zeile.Range(1, 47) = txt_mahl.Value
    143. Zeile.Range(1, 48) = txt_df.Value
    144. End Sub
    145. Private Sub btn_schliessen_Click()
    146. '-----------Schliesst die Eingabemaske ohne Prüfung
    147. Unload Me
    148. End Sub
    149. Private Sub btn_löschen_Click()
    150. 'leert alle vorhandenen Eingabefelder
    151. '-----------------------------Sortenangaben---------------------------
    152. txt_box_artikel = ""
    153. txt_box_sorte = ""
    154. txt_box_gramm = ""
    155. txt_box_charge = ""
    156. '----------------------------Rohstoffe Kilo---------------------------
    157. txt_rs1 = ""
    158. txt_rs2 = ""
    159. txt_rs3 = ""
    160. txt_rs4 = ""
    161. txt_rs5 = ""
    162. txt_rs6 = ""
    163. txt_rs7 = ""
    164. txt_rs8 = ""
    165. txt_rs9 = ""
    166. txt_rs10 = ""
    167. txt_rs11 = ""
    168. txt_rs12 = ""
    169. '----------------------------AP Kilo----------------------------------
    170. txt_ap1 = ""
    171. txt_ap2 = ""
    172. txt_ap3 = ""
    173. txt_ap4 = ""
    174. txt_ap5 = ""
    175. txt_ap6 = ""
    176. txt_ap7 = ""
    177. txt_ap8 = ""
    178. txt_ap9 = ""
    179. txt_ap10 = ""
    180. txt_ap11 = ""
    181. txt_ap12 = ""
    182. txt_ap13 = ""
    183. txt_ap14 = ""
    184. txt_ap15 = ""
    185. txt_ap16 = ""
    186. txt_rfff = ""
    187. '-------------------------------Bemerkungen---------------------------
    188. txt_bemerkung = ""
    189. txt_apinfo = ""
    190. '-------------------------------Zusätze-------------------------------
    191. txt_nass1 = ""
    192. txt_nass2 = ""
    193. txt_nass3 = ""
    194. txt_color1 = ""
    195. txt_color2 = ""
    196. txt_color3 = ""
    197. txt_color5 = ""
    198. txt_color6 = ""
    199. txt_color7 = ""
    200. txt_color8 = ""
    201. txt_color9 = ""
    202. txt_color10 = ""
    203. txt_color11 = ""
    204. txt_naoh = ""
    205. '---------------------------------Mahlung------------------------------
    206. txt_entstipper = ""
    207. txt_stippen = ""
    208. txt_ref1 = ""
    209. txt_ref2 = ""
    210. txt_ref3 = ""
    211. txt_ref4 = ""
    212. txt_mahl = ""
    213. txt_df = ""
    214. '---------------------------------Wasser-------------------------------
    215. txt_ansatz = ""
    216. txt_fuellen = ""
    217. '---------------------------------Sonoflot-----------------------------
    218. '----------------------------------------------------------------------
    219. End Sub


    Und es fehlen nach wie vor noch solche abrundenden sachen wie sicherheits abfragen:
    Sind alle felder leer -> speichern = Fehlermeldung:" keine Daten eingegeben!"
    oder sind bestimmte felder nicht gefüllt = Meldung:" Angabe zu "XY" nötig!"
    oder beim löschen =" sind sie sicher?"
    oder oder oder...

    Und das betrifft nur die ÉINE Tabelle der mappe...da kommen noch 2 hinzu in denen auch noch was gebaut werden muss....

    Wo ich schon dabei bin, ich hab noch eine WICHTIGE sache, die eigtl noch Vorrang vor dem hier gestartetem Problem hat :whistling:

    Und zwar hab ich ein Formular, in der selben mappe wie meine Datenbank, in welchem per "datenüberprüfungs-dropdown, ein Artikel gewählt wird, und die einzelnen angaben in ein danebenstehendes vorgefertigtes Layout geladen wird.
    Nun brauche ich EXAKT diese daten, in dem layout( oder einem anderem, abhängig von der Lösung :P) in einer NEUEN Arbeitsmappe OHNE die Formeln (SVERWEIS INDEX usw.) also die blanken werte die dastehen.

    PROBLEM: sobald ich versuche, die aktuell geladenen Daten aus der DB per "blatt verschieben und kopieren..."->neue Mappe zu erstellen, und DANN die DB schliesse....kommen in jeder Zelle bezugsfehler.

    URSACHE: Grund dafür scheint zu sein das ich die Artikel auswahl per "Datenüberprüfung" erstellt und nach einem NAME definiert habe. Denn sobald die Datenbank datei geschlossen ist, und ich nur noch die kopierte Version des einzelnen Rezepts in der neuen Mappe habe, finden die Formeln natürlich den bezug zu der "Namensliste" nicht mehr, da diese nur in der DB deklariert ist.

    Nun, brauch ich dieses "datenprüfungsdropdown" in der NEUEN datei aber auch nicht, da die dann lediglich als Übersicht dienen soll, und nicht zur bearbeitung gedacht ist allerdings würde im nächsten Schritt ein weiteres Blatt oder Datei wiederum auf diese Werte in der übersicht zugreifen.

    Nötige LÖSUNG: Ich brauch also irgendwie ein Makro oder Code, mit dem ich z.B:
    A) Ein Blatt Von Zeile1: Spalte4 bis Zeile 100:Spalte20 mit Spaltenbreite und Zeilenhöhe UND den reinen WERTEN und Formatierungen in eine NEUE Mappe kopieren kann
    B) Diese Mappe idealerweise noch benennt wie Zelle XYZ
    C) und Zeilen, die mit einem anderen Makro "ausgeblendet(hidden)" sind gleich noch mit ignoriert aber den nachfolgenden inhalt quasi an deren stelle setzt. (geht sowas überhaupt ^^?)

    Screen 5 + 6 beziehen sich darauf.

    EDIT2:

    Ich habe das eigentlich perfekte Tool gefunden für mein "speicher" Problem:


    nur will ich nicht wie in dem Video die Daten wieder in die selbe Datenbank schreiben, sondern in ENTWEDER eine neue Datei (die erzeugt wird)
    oder noch besser: in eine vorhande, in anderem Pfad liegende datei, in ein bestimmtes tabellenblatt...

    Aber ich habe null plan wie ich das mit dem im video geliefertem Code verbaue.
    Bilder
    • screen4.png

      33,77 kB, 1.066×667, 1.134 mal angesehen
    • scr5.png

      45,1 kB, 1.242×729, 689 mal angesehen
    • scr6.png

      64,66 kB, 1.238×916, 675 mal angesehen
    • scr7.png

      27,82 kB, 826×537, 1.340 mal angesehen

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Gelöschter Benutzer“ ()