Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1748to1752
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Listbox Einträge beim Laden Fehler

Listbox Einträge beim Laden Fehler
06.04.2020 13:44:52
Peer
Hallo.
Ich habe ein UF mit einer ListBox, in der ich Daten aus der Tabelle "Teilnehmer" lade. In der frm_Teilnehmer gibt es zwei Button "Doppelt" und "Aktualisieren".
Bei "Doppelt" sucht er die Einträge aus der Tabelle "Doppelt" und lädt sie in die ListBox.
Wenn ich auf "Aktualiseiren" klicke, soll er die Sub "Userform_Initialize" aufrufen, die beim Laden von frm_Teilnehmer ohne Probleme startet. Also sollte sie meiner Meinung nach anstandslos laufen.
Aber scheinbar bemängelt er leere Zellen in die zuladenden Spalten.
Ich verstehe es nicht, warum es beim Laden funktioniert und beim refreshen nicht? Mein VBA ist noch nicht auf dem Stand, den Fehler zu finden.
Vielleicht kann von den Profis jemand helfen?
Vielen Dank im Voraus.
https://www.herber.de/bbs/user/136446.xlsm
LG
Peer

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Listbox Einträge beim Laden Fehler
06.04.2020 17:31:07
Matthias
Moin!
Erstmal was positives - konnte eine Datei von dir ohne Probleme öffnen. :-)
Nun zum "Problem" und ein paar Tipps.
Der Fehler tritt auf, da du in der Prozedur Private Sub btn_Doppelt_Click() der Listbox ein Array an die Listeigenschaft zuweist. Wenn du dann Clear verwendest, löschst du zwar den Inhalt des Arrays aber nicht das Array selber. Zudem werden alle weiteren columncount ignoriert. Die Liste bleibt dann in der Größe deines Arrays. Wie kann man es also beheben.
Entweder Das Array das zugewiesen wird am Anfang gleich vergrößern (bei dir bis h statt bis Spalte D). Oder ein neues größeres Array zuweisen, das die Größe hat. Oder du weißt erst eine Rowsoruce zu und leerst sie dann wieder. bspw.
.RowSource = "A1"
.RowSource = ""

DAnn ist die Liste auch wieder leer.
Jetzt mal noch ein Tipp. Du änderst in deinem Code an mehreren Stellen die Spalten Anzahl und die Breite. Wenn notwendig, dann mach das nicht in einer schleife sondern davor. Ansosnten wird das bei jedem Schleifendurchlauf gemacht. Kann man sich sparen. Und um deine Probleme zu vermeiden, würde ich die Spaltenanzahl (also 8) schon bei der Listbox bei den Eigenschaften fest einstellen und nie wieder ändern. Maximal die Breite ändern. Wenn du eine Spalte auf 0 setzt, wird sie nicht angezeigt.
VG
Anzeige
AW: Listbox Einträge beim Laden Fehler
06.04.2020 18:06:07
Peer
Hallo Matthias.
Schön, dass du von mir auch mal etwas öffnen kannst. ;-)
Danke für die Hinweise.
Ich habe gleich mal die ListBox-Eigenschaft auf 8 eingestellt. In den Schleifen kann ich sie dann entfernen?
Ich habe deinen Ratschlag befolgt, und den Array auf H erweitert. Das war am einfachsten und es funktioniert. Auch danke für den Tipp.
Noch eine Frage hätte ich.
Wie kann ich erreichen, dass doppelte Einträge in der ListBox gelistet werden und über "Löschen" den "falschen" entferne? Bis jetzt wird die ListBox über das Sheet "Doppelt" ausgelesen.
Ich lade hier die aktuelle Mappe hoch (die du hoffentlich öffnen kannst ;-))
https://www.herber.de/bbs/user/136462.xlsm
LG
Peer
Anzeige
AW: Listbox Einträge beim Laden Fehler
06.04.2020 19:38:50
Matthias
Moin!
Da wäre die 1. Frage, löschen aus der Listbox oder aus der Datei? Falls du aus dem Blatt löschen willst, wäre noch zu klären, welcher der beiden Werte ist der falsche? In deiner Datei (die sich wieder öffnen lässt :-) ). Ist ein Name doppelt. Allerdings unterscheidet sich da das Geburtsdatum und der Bereich in Spalte H ff.. Da muss man unterscheiden, welcher raus soll bzw. wenn die Eintragungen unterschiedlich sind, welche die richtigen sind. Da wäre es ggf. besser die 8 Spalten auch beim Klick auf Doppelte mit anzuzeigen. Dann sieht man die Werte. Und lass bei Doppelte beide Namen stehen und nicht nur einen der beiden. Ansonsten kann man in der LB nicht vergleichen.
Um sie zu löschen hätte ich ad hoc 2 Möglichkeiten.
1. Variante. Du machst die LB mit 9 Spalten und trägst in die letzte Spalte immer die Zeile aus der Datei. Die Spalte lässt du daber nicht anzeigen. Beim Anklicken, kannst du dann die Zeilennummer auslesen und einfach löschen.
2. Ohne zusätzliche Spalte. Du prüfst über den listindex, welche Zeile gelöscht werden soll. Ist es bspw. der listindex 1 (steht ja für die zweite Zeile, also das zweite Auftreten) gehst du durch deine Daten (alternativ mit .find) und prüfst das Vorkommen. Beim 1. Treffer machst du nix, suchst weiter und beim zweiten Treffer löschst du die Zeile.
Das wären so die Ideen.
VG
Anzeige
AW: Listbox Einträge beim Laden Fehler
06.04.2020 19:51:17
Peer
Hallo Matthias.
Vielen Dank für deine schnelle Antwort.
Beide Einträge in der ListBox zu laden, wäre DIE Idee? Nur wie?
Dann läßt sich der doppelte Eintrag besser herausfinden. Soviel Einträge bekommt eine Person eh nicht, deshalb kann man ruhig alle Spalten anzeigen. Inklusive der Zeilen Nummer (listindex -1 ?).
Also ich hätte mich auch für die 1. Variante entschieden, da sie einfacher zu handhaben scheint. Damit kann man den Eintrag direkt in Sheet "Teilnehmer" löschen, oder?
LG
Peer
AW: Listbox Einträge beim Laden Fehler
06.04.2020 21:53:09
Matthias
Moin!
Also dann hier mal deine Datei zurück mit der Variante 1.
https://www.herber.de/bbs/user/136478.xlsm
Ich habe der LB jetzt mal 9 Spalten gegeben. Zu Testzwecken habe ich beim initialize die Breiten der Listboxspalten ein wenig angepasst. DA nochmal schauen, ob du es anders brauchst. Die mit der Zeilennummer ist ausgeblendet.
Den Code von doppelt habe ich angepasst. Dein Code steht noch darunter, wird aber nicht ausgeführt.
Beim Anklicken werden nur die mehrfach vorkommenden Daten eingetragen. Jetzt auf die schnelle ohne Kommentar - könnte man noch nachliefern. Die Werte werden jetzt nicht aus dem Blatt doppelt genommen sondern direkt im Code für die Liste generiert.
Wenn du dann einen der aufgelisteten Werte anklickst, kannst du ihn löschen. Den Button Löschen habe ich auch angepasst (dein Code wieder am Ende ohne Wirkung) Er wird dann im Blatt gelöscht und auch aus der Liste. Hier könnte man noch ergänzen, dass man den ggf. letzten Wert dann aus der Liste auch rausnimmt(nicht das man eine Person komplett löscht)
Beim Initialize ist in der letzten Spalte jetzt auch die Zeilennummer drin. Weiß jetzt aber nicht, ob du das noch im Code mit anpassen musst.
Schau es dir mal an und teste. Weiß auch nicht, ob sich ggf. andere Sachen damit geändert habe.
VG
Anzeige
AW: Listbox Einträge beim Laden Fehler
06.04.2020 22:16:37
Matthias
MoiN!
Da war noch ein kleiner Fehler bei einem index drin. Deshalb wurde das Herr zweimal angezeigt.
Tausche es mal bei doppelt so aus:
For zeile = 2 To zeilen
eintrag = False
If Not geprüft.exists(daten(zeile, 2) & "##" & daten(zeile, 3)) Then
For bzeile = zeile + 1 To zeilen
If daten(zeile, 2) = daten(bzeile, 2) And daten(zeile, 3) = daten(bzeile, 3) Then
If eintrag = False Then
.AddItem daten(zeile, 1)
For spalte = 1 To 6
.List(.ListCount - 1, spalte) = daten(zeile, spalte + 1)
Next
.List(.ListCount - 1, 7) = daten(zeile, 16)
.List(.ListCount - 1, 8) = zeile
geprüft.Add daten(zeile, 2) & "##" & daten(zeile, 3), 1
End If
.AddItem daten(zeile, 1)
For spalte = 1 To 6
.List(.ListCount - 1, spalte) = daten(bzeile, spalte + 1)
Next
.List(.ListCount - 1, 7) = daten(bzeile, 16)
.List(.ListCount - 1, 8) = zeile
End If
Next
End If
Next

VG
Anzeige
AW: Listbox Einträge beim Laden Fehler
07.04.2020 09:13:18
Peer
Hallo Matthias.
Vielen vielen Dank. Super Lösung. Frage noch dazu. für was stehen die beiden Rauten im "Doppelt"-Event?
Eins hätte ich aber gern noch im Löschen-Event.
Meine MsgBox vor dem Löschen hätte ich lieber behalten.
Ich habe gestern abend folgendes gebastelt...

Private Sub btn_TN_Delete_Click()
Dim i As Long
Dim OE As String, PersNr As String
PersNr = Me.lst_Teilnehmer.List(lst_Teilnehmer.ListIndex, 3)
OE = Me.lst_Teilnehmer.List(lst_Teilnehmer.ListIndex, 4)
If PersNr = "" Then
PersNr = "(ohne Pers-Nr.)"
Else:  PersNr = "(Pers-Nr.: " & PersNr & ")"
End If
If OE = "" Then
OE = "?"
Else: OE = OE
End If
For i = lst_Teilnehmer.ListCount - 1 To 0 Step -1
If Me.lst_Teilnehmer.Selected(i) = True Then
Me.lst_Teilnehmer.ColumnCount = 5
MsgBox Me.lst_Teilnehmer.List(lst_Teilnehmer.ListIndex, 0) & " " & _
Me.lst_Teilnehmer.List(lst_Teilnehmer.ListIndex, 2) & " " & _
Me.lst_Teilnehmer.List(lst_Teilnehmer.ListIndex, 1) & " " & _
PersNr & " " & _
"aus " & OE & " " & "löschen?", vbQuestion + vbOKOnly, "Löschen des gewä _
hlten Eintrages"
'Me.lst_Teilnehmer.RemoveItem (i)
End If
Next i
End Sub

Vielleicht kann man dies noch unterbringen?
LG
Peer
Anzeige
AW: Listbox Einträge beim Laden Fehler
07.04.2020 09:36:35
Peer
Hallo Matthias.
Ich habe das "Löschen"-Event einigermaßen angepasst. Aber die MsgBox ist noch richtig platziert.
Wo kann ich die MsgBox einfügen. Oder ist der Lösungsansatz verkehrt?
Private Sub btn_TN_Delete_Click()
Dim zeile As Long, i As Long
Dim OE As String, PersNr As String
If Me.lst_Teilnehmer.ListIndex = -1 Then Exit Sub
zeile = Me.lst_Teilnehmer.List(Me.lst_Teilnehmer.ListIndex, 8) 'Zeilennummer
PersNr = Me.lst_Teilnehmer.List(lst_Teilnehmer.ListIndex, 3)
OE = Me.lst_Teilnehmer.List(lst_Teilnehmer.ListIndex, 4)
If PersNr = "" Then
PersNr = "(ohne Pers-Nr.)"
Else:  PersNr = "(Pers-Nr.: " & PersNr & ")"
End If
If OE = "" Then
OE = "?"
Else: OE = OE
End If
For i = lst_Teilnehmer.ListCount - 1 To 0 Step -1
If Me.lst_Teilnehmer.Selected(i) = True Then
Me.lst_Teilnehmer.ColumnCount = 5
If MsgBox(Me.lst_Teilnehmer.List(lst_Teilnehmer.ListIndex, 0) & " " & _
Me.lst_Teilnehmer.List(lst_Teilnehmer.ListIndex, 2) & " " & _
Me.lst_Teilnehmer.List(lst_Teilnehmer.ListIndex, 1) & " " & _
PersNr & " " & _
"aus " & OE & " " & "löschen?", vbQuestion + vbYesNo, "Löschen des gewä _
hlten Eintrages") = vbYes Then
'Me.lst_Teilnehmer.RemoveItem (i)
Worksheets("Teilnehmer").Range("A" & zeile & ":P" & zeile).Delete Shift:=xlUp
Me.lst_Teilnehmer.RemoveItem (Me.lst_Teilnehmer.ListIndex)
Else: MsgBox "Nix gelöscht"
End If
End If
Next i
Exit Sub
Ein zweites Problem tritt noch auf.
Beim Löschen eines "einfachen" Eintrages nach dem Laden der UF kommt eine Meldung 94, wahrscheinlich da ich in der geladenen ListBox den Zeilenindex nicht mit lade, oder?
https://www.herber.de/bbs/user/136485.xlsm
Gruß Peer
Anzeige
AW: Listbox Einträge beim Laden Fehler
07.04.2020 13:47:25
Matthias
Moin!
Hier mal die Antwort auf deine Fragen.
1. Die ##
Das dient nur dazu, dass Vor- und Nachname getrennt sind. Ich nutze da immer gerne Zeichen, die sonst nicht genutzt werden. Da würde auch ein ; oder Komma gehen. Das kann aber ggf. auch bei der Eingabe mit erfasst worden sein, deshalb das #
2. Fehlermeldung 94
Genau, deine Vermutung. Du hast zwar 9 Spalten in der LB aber füllt nur 8. Die letzte beinhaltet dann Null. Das führt zu dem Fehler. Füge beim Initialize das hier am Ende ein.


.List(.ListCount - 1, 8) = i
3. MsgBox
ICh würde die Sache ein wenig vereinfachen. Die LBist ja nur für singelselect ausgelegt. Also kann man gleich über den Index gehen und braucht nicht extra eine Schleife durch alle Einträge. Die Msgbox soll dazu dienen, dass man vorher nochmal nachfragt oder? Sieht dann so aus:
Private Sub btn_TN_Delete_Click()
Dim zeile As Long, i As Long
Dim OE As String, PersNr As String
If Me.lst_Teilnehmer.ListIndex = -1 Then Exit Sub
zeile = Me.lst_Teilnehmer.List(Me.lst_Teilnehmer.ListIndex, 8) 'Zeilennummer
PersNr = Me.lst_Teilnehmer.List(lst_Teilnehmer.ListIndex, 3)
OE = Me.lst_Teilnehmer.List(lst_Teilnehmer.ListIndex, 4)
If PersNr = "" Then
PersNr = "(ohne Pers-Nr.)"
Else:  PersNr = "(Pers-Nr.: " & PersNr & ")"
End If
If OE = "" Then
OE = "?"
Else: OE = OE
End If
If MsgBox(Me.lst_Teilnehmer.List(lst_Teilnehmer.ListIndex, 0) & " " & _
Me.lst_Teilnehmer.List(lst_Teilnehmer.ListIndex, 2) & " " & _
Me.lst_Teilnehmer.List(lst_Teilnehmer.ListIndex, 1) & " " & _
PersNr & " " & _
"aus " & OE & " " & "löschen?", vbQuestion + vbYesNo, "Löschen des gewählten Eintrages") _
= vbYes Then
Worksheets("Teilnehmer").Range("A" & zeile & ":P" & zeile).Delete Shift:=xlUp
Me.lst_Teilnehmer.RemoveItem (Me.lst_Teilnehmer.ListIndex)
Else: MsgBox "Nix gelöscht"
End If
Exit Sub

Damit wird vorher gefragt und man kann es ggf. abbrechen. Schaue mal, ob es so richtig ist.
Wenn sonst noch Fragen sind, dann einfach melden.
VG
Anzeige
AW: Listbox Einträge beim Laden Fehler
07.04.2020 14:18:54
Peer
Hallo Matthias.
Das hat alles geklärt.
Vielen Dank für deine Hilfe.
Deine angebotene Hilfe nehme ich gern an.
Wie du an der Datei feststellen konntest, habe ich rechts neben der ListBox "Teilnehmer" eine weitere ListBox "Auswahl", mit der ich Teilnehmer von links nach rechts per Button transportiere. Dabei wird der Übersicht halber und Verhinderungen doppelter Auswahl der TN aus der linken Tabelle entfernt und nach rechts verschoben. Das klappt in diese Richtung auch bestens. Nur wenn ich den TN von rechst wieder nach links verschieben möchte, bekomme ich eine Fehlermeldung. Ich nehme an, das es auch wieder an dem Index liegt.
https://www.herber.de/bbs/user/136495.xlsm
Bis jetzt hatte alles funktioniert, nur hat sich beim Verschieben von links nach rechts die linke Liste nicht aktualisiert. Ich wollte aber beim Verschieben des Eintrag von rechts nach links, dass die linke Liste den Eintrag gleich in der Liste wieder zeigt. Dafür habe ich wieder das Userform_Initialize Sub genommen.
Vielleicht noch zum Verständnis, warum ich die rechte ListBox benötige.
In ihr sollen ausgesuchte TN gelistet werden, die ich dann über den Button "übertragen" in ein Worddokument in die Bookmarks übertragen möchte. Bei Text- und ComboBoxen haben ich kein Problem, nur bei den Listeneinträge(n) hänge ich noch. Ideal wird sein, wenn man den/die Listeneinträge wieder trennt und in die Bookmarks (z.B. Vorname und Name) schreibt.
Viel Text zum Lesen (und Verstehen), Sorry.
LG
Peer
Anzeige
AW: Listbox Einträge beim Laden Fehler
07.04.2020 16:53:25
Matthias
Moin!
Ja, das hängt wieder mit den Spalten der einzelnen Listboxen zusammen. Deshalb nochmal der Vorschlag 7 Hinweis. Lege die Spalten am Anfang bei den Einstellungen fest und nimm alle ! spätere Zuweisungen von columncount raus. Beim Übertrag von links nach rechts änderst du die Anzahl auch wieder und daher das Problem.
Addclick also nur so lassen:
Private Sub btn_ADD_Click()
Dim i As Long, j As Long
Me.lst_TN_Auswahl.ColumnCount = Me.lst_Teilnehmer.ColumnCount
For i = 0 To Me.lst_Teilnehmer.ListCount - 1
If Me.lst_Teilnehmer.Selected(i) = True Then
' gewählte TN in Auswahlliste übertragen
Me.lst_TN_Auswahl.AddItem Me.lst_Teilnehmer.List(i)
For j = 0 To Me.lst_Teilnehmer.ColumnCount - 1
Me.lst_TN_Auswahl.List(Me.lst_TN_Auswahl.ListCount - 1, j) = Me.lst_Teilnehmer. _
List(i, j)
Next j
End If
Next i
'gewählte TN aus TN_Liste löschen
For i = lst_Teilnehmer.ListCount - 1 To 0 Step -1
' MsgBox zur Kontrolle des Durchlaufs, welche TN nicht gewählt wurden
'MsgBox lst_Teilnehmer.List(i) & " - gewählt: " & lst_Teilnehmer.Selected(i)
If Me.lst_Teilnehmer.Selected(i) = True Then
Me.lst_Teilnehmer.RemoveItem (i)
End If
Next i
End Sub

Falls du das columncount drinne lassen musst, dann schaue, dass es immer 9 Spalten sind (in der 9. ist ja der INdex)
Da aber mal eine Frage zum Ablauf. Wenn die Daten in der linken Liste ja nicht wirklich weg sind, sondern in der rechten Liste nur gebraucht werden, um nach Word exportiert zu werden, willst du sie wirklich beim Übertrag links rauslöschen und später wieder von rechts zurückschreiben? Wir gehen jetzt mal von einem ja aus. :-) Dann würde ich den Code vom Rückschreiben vereinfachen. Theoretisch würde es reichen, wenn du die rechte Liste leerst und dein Initialize aufrufst. Da das Initialize die Teilnehmerliste eh überschreibst, brauchst du auch nix zurückschreiben. Problematisch daran ist, dass dies nur klappt, wenn du wirklich alles zurückschreiben willst. Hier mal eine Variante ohne Initialize. Dabei werden nur die Zeilen der Liste zurückgeschrieben, die ausgewählt wurden. Dabei nutzte ich das .additem aber mit Angabe der Zeile, in welcher eingefügt werden soll. Die Auswahl geschieht an Hand der in Spalte 9 gespeicherten Nummer - die brauchen wir also immer mit. Der Code sieht dann so aus.
Private Sub btn_Delete_Click()
Dim zeile As Long, zeileb As Long, spalte As Long
For zeile = lst_TN_Auswahl.ListCount - 1 To 0 Step -1
If Me.lst_TN_Auswahl.Selected(zeile) = True Then
For zeileb = 0 To Me.lst_Teilnehmer.ListCount - 1
If CLng(lst_TN_Auswahl.List(zeile, 8)) 

Wie immer mal testen und dann schauen.
VG
AW: Listbox Einträge beim Laden Fehler
08.04.2020 10:33:17
Peer
Hallo Matthias.
Das klappt prima.
Ich hatte alle Counts schon festgelegt, das auskommentieren / entfernen ist bei einigen Einstellungen vergessen worden.
Danke dir.
Die Spaltenbreiten kann ich ja trotzdem benutzen, einfach um eventuell nicht alle Spalten in jeder ListBox anzeigen zu lassen (aus Platzgründen zB)?
Eine kleine Frage noch.
Statt über den ListIndex (8) für die Zeilennummer zu gehen, kann ich auch mit RowSource die Quelle festlegen und darüber die Zeile steuern (also ändern oder löschen)?.
LG
Peer
AW: Listbox Einträge beim Laden Fehler
08.04.2020 13:55:04
Matthias
Moin!
Genau, die columnconut am besten raus. Die width und damit die Anzeige kannst du lassen. Damit liegen die Spalten in der Listbox ja noch vor, werden aber nur nicht angezeigt.
RowSource würde ich hier vermeiden. DAmit werden dir zwar die Daten angezeigt aber du kannst die nicht in der Listbox ändern bzw. Zeilen etc. ausblenden. Daten manipulieren geht dann nur in der Quelle, also direkt im Blatt. In deinem Fall also eigentlich ungeeignet. Da musst du wohl über die Spalte mit den Zeilennummern gehen.
VG
AW: Listbox Einträge beim Laden Fehler
08.04.2020 15:02:12
Peer
Hallo Matthias.
Danke für die Informationen.
Beim Durchspielen bin ich nun doch noch auf einen Fehler gestoßen, und zwar nach der "Suche" in der ListBox der Teilnehmer.
Der gesuchte Teilnehmer wird zwar in die ListBox lst_TN_Auswahl übertragen, aber der Debugger meckert über die ListEigenschaft.
Ich habe alle ListCount auskommentiert, kann aber den Fehler nicht finden.
Vieleicht hast du einen besseren Überblick?
https://www.herber.de/bbs/user/136538.xlsm
Vielen Dank für deine Mühe im Voraus.
Peer
AW: Listbox Einträge beim Laden Fehler
08.04.2020 19:36:33
Matthias
Moin!
Also da gab es jetzt ein paar Baustellen mehr. Zum Teil lag es an der column-Eigenschaft (mal wieder getarnt :-) ) und an der Übertragung der Daten. Du müsstest die beiden sub für die Suche und das Changeevent wie folgt ändern.
Bei txt_suche_change das hier:
Private Sub txt_Suche_Change()
Dim avntValues() As Variant, avntFilterValues() As Variant
Dim ialngIndex As Long, ialngCount As Long
Dim shQuelle As Worksheet
Dim strText As String
Dim letzteZeile As Long, letzteSpalte As Long, i As Long '****hinzugefügt
Set shQuelle = Sheets("Teilnehmer")
lst_Teilnehmer.Clear
With shQuelle
'***Änderung: avntValues ist jetzt ein Array über Spalte 1 bis 7 statt nur über Spalte 2:
letzteZeile = .Cells(.Rows.Count, 1).End(xlUp).Row
' Anzahl der anzuzeicgenden Spalten
letzteSpalte = 9
' Array beginnt Zeile 2 Spalte 1 endet in letzte Zeile und letzte Spalte
avntValues = .Range(.Cells(2, 1), .Cells(letzteZeile, letzteSpalte))
' Liste hat folgende Spaltenbreite
lst_Teilnehmer.ColumnWidths = "1cm;2cm;1,5cm;1,5cm;2,5cm;1cm;1cm;1cm;0cm"
strText = LCase$(Trim$(txt_Suche.Text))
If strText = vbNullString Then
'lst_Teilnehmer.List = avntValues
UserForm_Initialize
Else
For ialngIndex = LBound(avntValues) To UBound(avntValues, 1)
If LCase$(Left$(avntValues(ialngIndex, 2), Len(strText))) = strText Then
ialngCount = ialngCount + 1
ReDim Preserve avntFilterValues(1 To letzteSpalte, 1 To ialngCount) '***geä _
ndert
'ReDim Preserve avntFilterValues(1 To 2, 1 To ialngCount)
avntFilterValues(1, ialngCount) = avntValues(ialngIndex, 1)
avntFilterValues(2, ialngCount) = avntValues(ialngIndex, 2)
avntFilterValues(3, ialngCount) = avntValues(ialngIndex, 3)
avntFilterValues(4, ialngCount) = avntValues(ialngIndex, 4)
avntFilterValues(5, ialngCount) = avntValues(ialngIndex, 5)
avntFilterValues(6, ialngCount) = avntValues(ialngIndex, 6)
avntFilterValues(7, ialngCount) = avntValues(ialngIndex, 7)
avntFilterValues(8, ialngCount) = ""
avntFilterValues(9, ialngCount) = ialngIndex + 1
'avntFilterValues(8, ialngCount) = avntValues(ialngIndex, 16)
End If
Next
If ialngCount > 0 Then
lst_Teilnehmer.Column = avntFilterValues
Else
Call lst_Teilnehmer.AddItem("Kein Treffer")
End If
End If
End With
End Sub

Hier war das Problem, dass am Anfang an avntValues die Daten aus dem Blatt übergeben wurden. Da stand erst Spalten 7. Bei keinem TReffer, hätte er dann wieder diesen Bereich genommen und damit nur 7 Spalten gehabt. Zudem hatte der BEreich einen anderen INhalt als deine vorherige Liste. Dann musste man auch noch die zwei zusätzlichen Spalten füllen. Habe ich gemacht. Jetzt sollten da alle Daten passen.
Dann noch der Button suche
Private Sub btn_Suche_Click()
' Code aus j.hennekes.de/1228126.htm
Dim rngCell As Range
Dim strFirstAddress As String
With Worksheets("Teilnehmer").Range("B:B")
Me.lst_Teilnehmer.Clear
Set rngCell = .Find(Me.txt_Suche.Value, LookIn:=xlValues, lookat:=xlWhole)
If Not rngCell Is Nothing Then
strFirstAddress = rngCell.Address
Do
With Me.lst_Teilnehmer
'.ColumnCount = 7   'lieber weglassen und über die Eigenschaften der ListBox festlegen
.ColumnHeads = False
'.RowSource = "Teilnehmer!A2:P500"
.AddItem
.List(.ListCount - 1, 0) = rngCell.Offset(0, -1).Value
.List(.ListCount - 1, 1) = rngCell
.List(.ListCount - 1, 2) = rngCell.Offset(0, 1).Value
.List(.ListCount - 1, 3) = rngCell.Offset(0, 2).Value
.List(.ListCount - 1, 4) = rngCell.Offset(0, 3).Value
.List(.ListCount - 1, 5) = rngCell.Offset(0, 4).Value
.List(.ListCount - 1, 6) = rngCell.Offset(0, 5).Value
.List(.ListCount - 1, 7) = rngCell.Offset(0, 16).Value
.List(.ListCount - 1, 8) = rngCell.Row
.ColumnWidths = "1cm;2cm;1,5cm;1,5cm;2,5cm;1cm;1cm;1cm;0cm"
End With
Set rngCell = .FindNext(rngCell)
Loop While Not rngCell Is Nothing And rngCell.Address  strFirstAddress
Else
MsgBox "Teilnehmer nicht gefunden", 48
End If
End With
End Sub

HIer stimmte die Zuordnung der Werte nicht. Außerdem wurden auch wieder nicht alle 9 Spalten befüllt. Damit kamen dann wieder Fehler.
Habe dann noch ein wenig gestest. Ändere die Sub hier auch mal.
Private Sub btn_Delete_Click()
Dim zeile As Long, zeileb As Long, spalte As Long
For zeile = lst_TN_Auswahl.ListCount - 1 To 0 Step -1
If Me.lst_TN_Auswahl.Selected(zeile) = True Then
For zeileb = 0 To Me.lst_Teilnehmer.ListCount - 1
If CLng(lst_TN_Auswahl.List(zeile, 8)) 

Damit wird beim Rückschreiben auch bei einer leeren Liste richtig eingefügt. Und nimm in der Sub Sub btn_ADD_Click() am Ende die Schleife raus. Da reicht das
Me.lst_Teilnehmer.RemoveItem (Me.lst_Teilnehmer.ListIndex)

Ansonsten schmeißt er dir bei einer gefilterten LIste alles raus. Wie gesagt, du hast dort nur eine Einfachauswahl drin. Die Schleife ist also unnötigt. Wenn du es aber auf Mehrfachauswahl setzt, könnten evtl. andere Makros nicht mehr passen.
Da ggf. nochmal Gedanken machen und schauen, wie es später sein soll. Das kann natürlich dazu führen, dass man Teile vom Code nochmal aufsetzen muss (wäre aber wohl nicht viel).
VG
AW: Listbox Einträge beim Laden Fehler
08.04.2020 20:08:51
Peer
Hallo Matthias.
Was soll ich sagen. Perfekt.
Ich kann mich nie richtig bedanken für deine Mühe.
Trotzdem...
Vielen lieben Dank.
LG
Peer

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige