Anliegen:
Ich möchte die UserForm1 als Eingabemaske für das Tabelleblatt nutzen. Die ComboBoxen 1 und 2 sind voneinander abhängig. Sobald man ComboBox1 und 2 ausgewählt hat, füllen sich die ComboBoxen 3 und 4 und die TextBox1 automatisch. Die Werte befinden sich alle in einer Zeile.
In die ComboBoxen 3 und 4 gehören nur vordefinierte Werte. TextBox1 enthält sonstige Notizen und wird klassisch als Textbox individuell gefüllt. Sprich, jeder kann hier sonstige Einträge einfügen.
Aktueller Bearbeitungsstand:
Ich habe mir den unteren Code anhand diverser Foren zusammengestellt (vielleicht kann man mein Anliegen auch sinnvoller/eleganter lösen?) Die ComboBoxen 1 und 2 sind voneinander abhängig und die ComboBoxen 3 und 4 beinhalten nur vordefinierte Werte. Der Inhalt der TextBox1 wird auch korrekt angezeigt. Würde mal keine Änderung vornehmen wollen, würde der Code so funktionieren.
Problem:
Mein Hauptanliegen ist es die UserForm1 als Eingabemaske zu nutzen und damit Änderungen vorzunehmen. Hierzu befindet sich auf der UserForm ein Button Speichern (CommandButton1), welcher die vorgenommenen Änderungen speichert. Durch meine sehr durchwachsenen VBA-Kenntnisse gelingt mir diese Umsetzung bis jetzt leider nicht. Sobald ich eine Änderung vornehme und den Speichern-Button betätige, wird diese Änderung in Zeile 2 umgesetzt und nicht in der entsprechenden Zeile, die zur ComboBox1 und 2 Auswahl zugehörig ist.
Wäre sehr nett, wenn mir einer von euch helfen könnte mein Anliegen zu lösen.
Besten Dank im Voraus!
Option Explicit
Const C_mstrDatenblatt As String = "Tabelle1"
Dim mobjDic As Object
Dim mlngLast As Long
Dim mlngZ As Long
Private Sub ComboBox1_Enter()
Set mobjDic = CreateObject("Scripting.Dictionary")
For mlngZ = 2 To mlngLast
mobjDic(Worksheets(C_mstrDatenblatt).Cells(mlngZ, 1).Value) = 0
Next
Me.ComboBox1.List = mobjDic.keys
Set mobjDic = Nothing
End Sub
Private Sub ComboBox2_Enter()
'Zweite Combobox in Abhängigkeit von Combobox1.
'Jeder passende Stadt in Spalte B wird einmalig angezeigt.
Set mobjDic = CreateObject("Scripting.Dictionary")
With Worksheets(C_mstrDatenblatt)
For mlngZ = 2 To mlngLast
If .Cells(mlngZ, 1).Value = Me.ComboBox1.Value Then
mobjDic(.Cells(mlngZ, 2).Value) = 0
End If
Next
End With
Me.ComboBox2.List = mobjDic.keys
Set mobjDic = Nothing
End Sub
Private Sub ComboBox2_Change()
Dim mlngZ As Variant
Set mlngZ = Sheets("Tabelle1").Range("B1:B250").Find(ComboBox2)
If Nothing Is Nothing Then
ComboBox3 = Sheets("Tabelle1").Range("C" & mlngZ.Row)
ComboBox4 = Sheets("Tabelle1").Range("D" & mlngZ.Row)
TextBox1 = Sheets("Tabelle1").Range("E" & mlngZ.Row)
End If
End Sub
Private Sub CommandButton1_Click()
'Speichern Schaltfläche Ereignisroutine
Dim lZeile As Long
If Trim(CStr(ComboBox1.Text)) = "" Then
'Meldung ausgeben
MsgBox "Sie müssen mindestens einen Namen eingeben!", vbCritical + vbOKOnly, "FEHLER!"
'Abbrechen der Speicherroutine
Exit Sub
End If
lZeile = 2 'HIER IST MEIN PROBLEM Start in Zeile 2, Zeile 1 sind ja die Überschriften
'Schleife solange etwas in der ersten Spalte in Tabelle 1 drin steht
Do While Trim(CStr(Tabelle1.Cells(lZeile, 1).Value)) ""
'Eintrag gefunden, TextBoxen in die Zellen schreiben
Tabelle1.Cells(lZeile, 1).Value = Trim(CStr(ComboBox1.Text))
Tabelle1.Cells(lZeile, 2).Value = ComboBox2.Text
Tabelle1.Cells(lZeile, 3).Value = ComboBox3.Text
Tabelle1.Cells(lZeile, 4).Value = ComboBox4.Text
Tabelle1.Cells(lZeile, 5).Value = TextBox1.Text
Exit Do 'Vorzeitiges Ende, da der Datensatz schon gefunden ist
Loop
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()
'Bei Start der Userform wird die unterste Zeile in Spalte A ermittelt
mlngLast = Worksheets(C_mstrDatenblatt).Cells(Rows.Count, 1).End(xlUp).Row
With Me.ComboBox3
.AddItem "a"
.AddItem "b"
.AddItem "c"
End With
With Me.ComboBox4
.AddItem "gut"
.AddItem "mittel"
.AddItem "schlecht"
End With
End Sub