AW: Checkbox UserForm auslesen und eintragen
20.04.2022 20:06:44
ralf_b
Es ist sicher ein Problem wenn man auf unterschiedlichen Tabellenblättern auch die Spalten erst noch suchen mußt weil die Tabellen nicht identisch sind. Im Normalfall hat man nur eine Datenbank(Tabelle) und die bearbeitet man zeilenweise. Da weis man in welcher Spalte welche Werte stehen. Dann kann man dann auch die Nr der aktuell geladenen Datensatzzeile in der Userform unterbringen. Das erleichtert dann das zurückschreiben der Werte. Wenn du nach einem Datensatz suchst, um den Datensatz zu ändern, kannst du den Wert in der Suchspalte nicht ändern. Sonst findest du den Datensatz nicht mehr beim zurückschreiben. Hier hat sich ein Trick gewährt. In der combobox suche lädst du alle deine Kunden. Du könntest in eine unsichtbaren Spalte die Zeilennummern mitschreiben und sie immer per comboxsuche.list( comboboxsuche.listindex , 1) die zweite (unsichtbare) Spalte abfragen.
Eine mögliche Lösung um die Spalten nicht jedesmal suchen zu müssen wäre ein Dictionary oder eine Collection in der man bei jedem Blattwechsel die Spalten in Key/Item Kombination hinterlegen könnte. In der Folge könntest du mittels Aufruf des Keys(Spaltenname) auf das Item(Spaltennummer ) zugreifen. Das ginge auch ganz einfach ohne solche Datenobjekte wenn du deine Tabellen in intelligente Tabellen( Listobjects) umwandelst. Dann geht der Zugriff auf die richtige Spalte direkt mit dem Spaltennamen.
Generell solltest du Code der mehrfach vorkommt in Sub-Routinen oder Functions auslagern. Denkbar wäre das für die Spaltensuche oder den aktiven Optionbutton. Aber auch das Einlesen und Zurückschreiben der Datensätze können in eigenen Subs untergebracht werden.
Du siehst das sind ettliche Baustellen. Wenn man jetzt hier irgendwo mittendrin anfängt, macht man das später alles nochmal weil die zündende Idee den alten Code komplett überflüssig macht.
Hier mal ein Versuch ohne den Code getestet zuhaben,
Function getColumnNr(strSuchwort As String)
Dim erg
erg = Application.Match(strSuchwort, Sheets(varTabName).Rows("13:13"), 0)
If IsNumeric(erg) Then
getColumnNr = erg
Else
getColumnNr = -1
End If
End Function
Sub setTableValue(lRow As Long, strColname As String, strVal As Variant)
Dim lngColNr As Long
lngColNr = getColumnNr(strColname)
If lngColNr > -1 Then Sheets(varTabName).Cells(lRow, lngColNr).Value = strVal
End Sub
Private Sub Btn_Aendern_Click()
Dim varSpaltenName As Range, Sz As Long, lngColNr As Long
With Sheets(varTabName)
Sz = Cbo_Suche.ListIndex + 14
' TextBoxNr
setTableValue Sz, "Kundennummer", CDbl(TextBoxNr)
' Interessent
setTableValue Sz, "Interessent", strvalOpt
' TextBox_Name
setTableValue Sz, "Name", TextBox_Name.Text
' TextBox_Adresse
setTableValue Sz, "Adresse", TextBox_Adresse.Text
usw....