Moin an alle, habe das Problem jetzt gelöst und poste das hier mal rein, falls jemand mal ein ähnliches Problem hat und herumgoogelt oder jemand einfach nur Interesse hat. Um das Problem zu verstehen, braucht man noch den vollständigen Code der Prozedur die durch das Klicken in die Listbox aufgerufen wird. Hier der Code für beide Prozeduren.
Private Sub cmd_VSave_Click()
Dim iRow As Long
If Lst_Vrmtr.ListIndex = -1 Then Exit Sub
If Trim(CStr(txt_VName.Text)) = "" Then
MsgBox "Bitte trage einen Namen ein!", vbCritical + vbOKOnly, "Fehler!"
Exit Sub
End If
'Ausbauoption: Überprüfen ob ID schon irgendwo in Tabelle vorhanden ist!
iRow = 2
Dim Newname As String
Do While Trim(CStr(WksVrmtr.Cells(iRow, 1).Value)) <> ""
If Lst_Vrmtr.List(Lst_Vrmtr.ListIndex, 0) = Trim(CStr(WksVrmtr.Cells(iRow, 1).Value)) Then
With WksVrmtr
.Cells(iRow, 3).Value = cmb_VAnrede.Value
.Cells(iRow, 4).Value = txt_VHandyA.Value
.Cells(iRow, 5).Value = txt_VHandyB.Value
.Cells(iRow, 6).Value = txt_VFestnetz.Value
.Cells(iRow, 7).Value = txt_VFax.Value
.Cells(iRow, 8).Value = txt_VMail.Value
.Cells(iRow, 9).Value = txt_VHomepage.Value
.Cells(iRow, 10).Value = txt_VAnmerkung.Value
.Cells(iRow, 2).Value = txt_VName.Value 'HIER die Abfrage wo es krumm wurde
End With
'Application.EnableEvents = True
'If Lst_Vrmtr.List(Lst_Vrmtr.ListIndex, 1) <> Trim(CStr(txt_VName.Text)) Then
'Call UserForm_Initialize
'If Lst_Vrmtr.ListCount > 0 Then Lst_Vrmtr1.ListIndex = 0
'End If
Exit Do
End If
iRow = iRow + 1
Loop
End Sub
---------------------------------------------------------------------------------
Private Sub Lst_Vrmtr_Click()
Dim VTxtRow As Long
Dim i As Long
Dim strVrmtr As String
If Lst_Vrmtr.ListIndex >= 0 Then
VTxtRow = 2
i = 0
Dim singleselect As Boolean
singleselect = False
Do While Trim(CStr(WksVrmtr.Cells(VTxtRow, 1).Value)) <> ""
If Lst_Vrmtr.List(Lst_Vrmtr.ListIndex, 0) = Trim(CStr(WksVrmtr.Cells(VTxtRow, 1).Value)) Then
txt_VID = WksVrmtr.Cells(VTxtRow, 1).Value
txt_VName = WksVrmtr.Cells(VTxtRow, 2).Value
txt_VHandyA = WksVrmtr.Cells(VTxtRow, 4).Value
txt_VHandyB = WksVrmtr.Cells(VTxtRow, 5).Value
txt_VFestnetz = WksVrmtr.Cells(VTxtRow, 6).Value
txt_VFax = WksVrmtr.Cells(VTxtRow, 7).Value
txt_VMail = WksVrmtr.Cells(VTxtRow, 8).Value
txt_VHomepage = WksVrmtr.Cells(VTxtRow, 9).Value
txt_VAnmerkung = WksVrmtr.Cells(VTxtRow, 10).Value
cmb_VAnrede = WksVrmtr.Cells(VTxtRow, 3).Value
Exit Do
End If
VTxtRow = VTxtRow + 1
Loop
End If
End Sub
Aus einem sehr spezifischen Grund ruft er aus auch bei ausgeschalteten Events die untere Click Prozedur unten auf wenn er in der oberen Save Prozedur den Value der Textbox txt_VName in die Tabelle schreiben soll und in dieser Clickboxprozedur werden die Textboxen überschrieben mit den Werten aus den Tabellen, also genau das Gegenteil von dem was ich haben wollte. Mein erster Workaround war also diese Abfrage unter alle anderen Textboxen in der with - end with zu setzen so wie es jetzt oben steht. Jetzt hat zwar alles funktioniert wie ich wollte, aber abstrus war es trotzdem: Wenn er bei der gekennzeichneten Zeile
.Cells(iRow, 2).Value = txt_VName.Value
angekommen war, sprang er in die Click Prozedur, hat sie erfolglosdurchlaufen, danach den geänderten Namen in die Listbox eingetragen, ist nocheinmal die Click Prozedur durchlaufen und hat danach dann endlich wie gewünscht den geänderten Namen in die Tabelle eingetragen. Hat zwar funktioniert, aber ich wollt natürlich wissen wie und warum.
Quelle allen Übels war folgender Codeabschnitt wenn die Userform initalisiert wurde, der verantwortlich dafür war die zweispaltige Listbox mit Werten zu füllen:
With WksVrmtr
With Intersect(.UsedRange, Range("A2:B" & VLRow))
Lst_Vrmtr.RowSource = .Address
Lst_Vrmtr.ColumnWidths = "0;"
End With
End With
Die Änderungen in Lst_Vrmtr.RowSource war das Event was alles durcheinander gebracht hat! Habe das alles wieder umgeändert in klassischen Schleifen, die zwar insgesamt mehr Code fressen, aber dafür läuft jetzt alles so wie es laufen soll ohne irgendwelche komischen Workarounds. Falls es andere gibt die eine Listbox mit zwei Spalten haben, die ähnlich aufgebaut ist wie meine: Nutzt lieber Schleifen. Hab es jetzt so gemacht:
lRow = 2
Do While Trim(CStr(WksVrmtr.Cells(lRow, 1).Value)) <> ""
.List(.ListCount - 1, 1) = WksVrmtr.Cells(lRow, 2).Value
End With
lRow = lRow + 1
Loop
Lst_Vrmtr.ColumnWidths = "0;"
Danke trotzdem allen!
|