Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Listbox leeren + Listbox Ergebnis anhand von Textbox und Kombobox generieren

Forumthread: Listbox leeren + Listbox Ergebnis anhand von Textbox und Kombobox generieren

Listbox leeren + Listbox Ergebnis anhand von Textbox und Kombobox generieren
04.01.2020 18:12:02
Textbox
Hallo zusammen,
ich grübel seit Tagen mit zwei Problemen, bei welchen ich aktuell leider nicht weiterkomme.
Deshalb meine Frage an die Expertenrunde :)
Folgende Vorgehensweise:
Ich habe eine Userform bestehend aus vier Textfeldern, 5 Comboboxen und einer Listbox erstellt.
Sowohl die Textfelder als auch die Comboboxen sind für die Eingabe vorbestimmt und können genutzt werden. Dies geschieht in unterschiedlichen Variationen. Aktuell ist das Makro so aufgebaut,
CommandButton5_Click()
IF Prüfung ob eines der Textfelder oder Comboboxen gefüllt ist, dann
Die Basisdaten ins Array laden. Im Arbeitsspeicher prüfen ob die IF Bedingung gegeben ist,
Falls ja, das neue Array auf einem neuen Arbeitsblatt auswerfen, anschließend als neues Array einlesen
und in der Listbox ausgeben. Aufgrund der Spaltenanzahl > 10 muss ich den Weg über das Array bzw. Rowsource gehen anstelle von Additem.
1. Problem:
Die Suche anhand der Textfelder, auch in Variation, funktioniert.
Die Suche anhand der Combobox (alleinstehend) mit dem Listenindex 1 funktioniert hervorragend.
Bei dem zweiten nicht, obwohl es der exakt selbe Code mit unterschiedlichen Variablen ist? Woran kann das liegen?
2. Problem: Aufgrund des Array bzw. Mehrspaltenproblems funktioniert im Falle einer erneuten Suche das Löschen der Listbox nicht über den Command .clear bzw. Me.Listbox1.clear weshalb ich folgenden Code im Forum gefunden habe:
  With Me.ListBox1
If .ListIndex > -1 Then .RemoveItem (.ListIndex)
End With
Hierbei werden zwar vereinzelte Zeilen gelöscht, stellenweise muss ich aber mehrmals suchen bis sich die Listbox auflöst. Wie kann ich dieses Problem sauber beheben?
3. Problem:
Besteht ein Ansatz, welcher im Falle der Suchbetätigung prüft welche Textfelder bzw. Comboboxen genutzt werden und passt das Makro entsprechend an oder muss ich unzählige Elseif Bedingungen schreiben? ;-)
Herzlichen Dank für eure Hilfe!
Viele Grüße,
Stefan
Anzeige
AW: Listbox leeren + Listbox Ergebnis anhand von Textbox und Kombobox generieren
04.01.2020 18:51:16
Textbox
Hi Stefan,
nur n paar Tipps:
- du hast sehr viele Fragen (eingangs schreibst du von 2 Problemen. Wo kommt denn Problem 3 her?)
- auch, wenn du bestimmt schon einiges selbst gelöst hast, sieht das jetzt von dir Geschriebene aus wie ein Wunsch nach "Auftragsprogrammierung").
Ein Forum ist primär nicht dazu da, Geld zu sparen, sondern den Fragenden in angemessenem Rahmen zu helfen.
- ich würde vorschlagen, pro Beitrag immer nur 1 Frage zu stellen. Wenn diese beantwortet ist, in einem - neuen - Beitrag Frage 2 zu stellen...usw
Ciao
Thorsten
Anzeige
AW: Listbox leeren + Listbox Ergebnis anhand von Textbox und Kombobox generieren
04.01.2020 20:36:19
Textbox
Hi ihr zwei,
sorry, in der Tat es sind etwas mehr verpackte Fehler.. Nehme deinen Ratschlag gerne zur Herzen Thorsten und werde zukünftig nur immer einen Problemfall online stellen.
Damit etwas mehr Klarheit herrscht, hier ein Auszug aus dem Code mit ein paar Anmerkungen,
Public letzteZeileArray As Integer
Private Sub CommandButton5_Click()
Dim vArr As Variant
Dim i As Integer
Dim j As Integer
Dim n As Integer
Dim m As Integer
Dim strT As String
Dim strW As String
Dim k As Integer
Dim vOut As Variant
Dim letzteZeileNeuesArray As Long
Dim letzteSuchZeilenArrayLoeschen As Long
Dim SText As Integer
Dim SText2 As Integer
Dim AB As String
strT = Me.TextBox12.Value
strW = Me.TextBox2.Value
AB = "Erledigen"
With Me.TextBox12.Value
If Len(strT)  0 Then
SText = 1
Else
SText = 0
End If
End With
With Me.TextBox2.Value
If Len(strW)  0 Then
SText2 = 1
Else
SText2 = 0
End If
End With
' ... div. If Pruefungen
''***** 12. Fall     Nur Ein Fall von X
ElseIf Me.ComboBox1.ListIndex = 0 And SText = 0 And SText2 = 0 _
And Me.ComboBox2.ListIndex = 0 And _
Me.ComboBox3.ListIndex = 2 And Me.ComboBox4.ListIndex = 0 And Me.ComboBox5.ListIndex = 0 Then
vArr = wb_TJ.Worksheets("Planung").Range("A2:M" & letzteZeileArray).Value
ReDim vOut(0 To UBound(vArr, 2) - 1, 0 To UBound(vArr, 1) - 1)
For i = 1 To UBound(vArr, 1)
If vArr(i, 6) = AB Then '  Hier werden entsprechend der oberen ElseIf Bedingung die  _
Suchparameter angepasst
For j = 1 To UBound(vArr, 2)
vOut(j - 1, k) = vArr(i, j)
Next j
k = k + 1
End If
Next i
'*** Im Falle einer vorherigen Suche, das ausgewiesene Array auf Tabelle 1 loeschen
letzteSuchZeilenArrayLoeschen = wb_TJ.Worksheets("Tabelle1").Range("A" & Rows.Count).End(xlUp) _
.Row
With wb_TJ.Worksheets("Tabelle1")
For i = letzteSuchZeilenArrayLoeschen to 2 -1
.Rows(i).Delete
Next i
End With
'*** Inhalt der Listbox im Falle von vorheriger Suchen loeschen
With Me.ListBox1
If .ListIndex > -1 Then .RemoveItem (.ListIndex)
End With
'*** Listbox Inhalt aufarbeiten und in Tabelle 1 auswerfen
With Me.ListBox1
If vOut(0, 0)  "" Then  ' Pruefen ob ein Treffer erzeugt wurde
With wb_TJ.Worksheets("Tabelle1")
For z = 1 To k
For s = 1 To UBound(vArr, 2)
.Cells(z + 1, s).Value = vOut(0 + m, 0 + n)
m = m + 1
Next s
m = 0
n = n + 1
Next z
End With
'*** Einlesen des neuen Array aus Tabelle 1 und anzeige in der Listbox1
letzteZeileNeuesArray = wb_TJ.Worksheets("Tabelle1").Range("A" & Rows.Count).End(xlUp). _
Row
.ColumnCount = 13
.ColumnHeads = True
.RowSource = "'[ArbeitsmappeTJ.xlsx]Tabelle1'!A2:M" & letzteZeileNeuesArray
End If
End With
'.. Naechste Bedingung
Bin dankbar über eure Kommentare
Anzeige
AW: Listbox leeren + Listbox Ergebnis anhand von Textbox und Kombobox generieren
04.01.2020 19:15:29
Textbox
Moin!
Ich glaube für deine Frage wäre auch die Datei von Nöten!
zu1.
Das liegt meines erachtens am Code. Den müsste man sehen. Außerdem verstehe ich nicht, was du mit Combobox mit LIstindex 1 meinst. Soll da nur ein Wert drin stehen?
zu 2.
Was meinst du mit .clear geht nicht? Geht es nicht, weil ein Fehler auftritt oder weil dann alle Daten weg sind?
zu3.
Du kannst die Eigenschaft controls der UF durchgehen. Hierbei kannst du prüfen, um was es sich handelt und ob was drin steht. Wenn du die NAmen weißt, kannst du das dabei bei controls mit angeben. bspw.
for i = 1 to 3
if me.controls("Textbox" & i) then machwas
next
Das wertet dir die erten 3 Textboxen (vom Namen die erten ) aus.
VG
Anzeige
AW: Listbox leeren + Listbox Ergebnis anhand von Textbox und Kombobox generieren
05.01.2020 08:40:44
Textbox
Moin Matthias,
einen Ausschnitt vom Code habe ich gestern hochgeladen.
Zu 1.)
Über Listindex der ComboBoxe lese ich aus, welcher Wert genutzt wurde -1 bis x
In meinem Fall funktioniert es mit dem ersten listenindex, hingegen mit dem zweiten nicht.
Erstaunlicherweise funktioniert es aber bei der zweiten ComboBox. Insofern sollte ich das Problem
Schon irgendwie gelöst bekommen.
Zu 2.) korrekt ich erhalte dann immer eine Fehlermeldung, was ich später mal versuchen werde ist, dass im Falle
Eines changeereignisses einer ComboBox die listbox geleert wird. Vielleicht hilft das weiter.
Zu 3.) danke für den Tipp :) ich hatte das bei den Formatierungen bereits genutzt
Viele Grüße,
Stefan
Anzeige
AW: Listbox leeren + Listbox Ergebnis anhand von Textbox und Kombobox generieren
05.01.2020 08:40:46
Textbox
Moin Matthias,
einen Ausschnitt vom Code habe ich gestern hochgeladen.
Zu 1.)
Über Listindex der ComboBoxe lese ich aus, welcher Wert genutzt wurde -1 bis x
In meinem Fall funktioniert es mit dem ersten listenindex, hingegen mit dem zweiten nicht.
Erstaunlicherweise funktioniert es aber bei der zweiten ComboBox. Insofern sollte ich das Problem
Schon irgendwie gelöst bekommen.
Zu 2.) korrekt ich erhalte dann immer eine Fehlermeldung, was ich später mal versuchen werde ist, dass im Falle
Eines changeereignisses einer ComboBox die listbox geleert wird. Vielleicht hilft das weiter.
Zu 3.) danke für den Tipp :) ich hatte das bei den Formatierungen bereits genutzt
Viele Grüße,
Stefan
Anzeige
AW: Listbox leeren + Listbox Ergebnis anhand von Textbox und Kombobox generieren
05.01.2020 12:14:14
Textbox
Moin!
Habe mir den Code mal angeschaut und habe ehrlich gesagt mehr Fragen den Antworten.
1. deine elseif am Anfang eines IF Blocks klappt so nicht. Da kannst du nur mit if beginnen und ggf. beim else Zweige mit elseif eine weitere Prüfung beginnen. AUßerdem erkenne ich keine end if - oder soll der Ganze Code dahinter dann ausgeführt werden?
2. Hast du da wirklich 12 Prüffälle mit jeweils so viel Code. Das kann man bestimmt anders regeln.
3. in der Schleife hier For i = letzteSuchZeilenArrayLoeschen To 2 - 1
löscht du max. 1 Wert. Nämlich nur dann, wenn deine Variable 1 ist. Da fehlt vor der -1 ein Step. So würdest du nur bis 2 -1 also 1 zählen. Weiß nicht, ob das gewollt ist.
4. Für welche Frage ist den der Code? Zur Listbox2 habe ich da jetzt nichts gefunden. Da kann man nichts sagen, woran es gelegen hat. Bzgl. des Löschen in der Listbox verstehe ich das Problem noch nicht ganz. .clear funktioniert ja. Wenn du aber nicht alle sondern nur mehrere löschen willst, dann nutze multiselect in der LIstbox und gehen in der Schleife durch, ob ein Eintrag selektiert wurde. Denn kannst du dann mit remove löschen. Dabei am besten von unten nach oben durchgehen. Geht. bspw.
for i = listbox1.listcount -1 to 0 step -1
if listbox1.selected(i) then listbox1.removitem(i)
next

Ist jetzt nur so aus dem Kopf hingeschrieben, weiß nicht genau ob das fehlerfrei ist.
Ich würde fast vorschlagen, erkläre mal was du genau machen willst, lade deine Datei hoch und dann kann man schauen, ob man es nicht anders lösen kann. Ansonsten bitte nochmal erklären, was der Code machen soll und was er nicht macht. Dann kann man ihn anpassen.
VG
Anzeige
AW: Listbox leeren + Listbox Ergebnis anhand von Textbox und Kombobox generieren
05.01.2020 15:01:21
Textbox
Moin Matthias,
sorry für die Verwirrung ;-) In der Tat der Code ist etwas komplexer und langzeiliger..
1.) Eine erste IF Bedingung existiert ... der Fall war nur ein Ausschnitt von div. ElseIf abzweigungen
2.) In der Tat ja und es werden leider mit zunehmender Anzahl an Comboboxen bzw. Texteingabefeldern immer mehr.
3.) Da war ein Bug, danke für den Hinweis! Habe es nun mit einer Unterfunktion geändert indem ich das Array auslese und die Zeilen dann komplett lösche - funktioniert
4.) Siehe da, durch den neuen Löschvorgang kann ich auch wieder sauber das neue Array einlesen. Insofern säubere ich die Listbox nun wie folgt, 1. Prüfen der IF bzw. elseif Bedingung, 2. Löschen der alten Datensätze auf dem Hilfsblatt, 3. neues Array einlesen bzw. Rowsource (Damit wir die Listbox leer bzw. nur mit den Überschriften angezeigt), neue Suchdatensätze auf Hilfsblatt schreiben, Suchdatensätze mittels Rowsource einlesen
Und zu guter letzt konnte ich auch das Problem mit dem zweiten Listenindex lösen. Lag an einem Eingabefehler in den Daten, deshalb gab es keinen Suchtreffer im Listenfeld. Also alle Probleme gelöst :) Trotzdem Danke für deine Hilfestellung
VG
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Listbox leeren und Ergebnisse mit Textbox und Kombobox generieren


Schritt-für-Schritt-Anleitung

  1. Userform erstellen: Erstelle eine Userform mit den benötigten Textfeldern, Comboboxen und einer Listbox. Stelle sicher, dass die Listbox mehrspaltig ist, da du mehr als 10 Spalten anzeigen möchtest.

  2. Makro einrichten: Implementiere das Makro im CommandButton5_Click()-Ereignis. Hier kannst du die Logik für die Suche und das Einlesen der Daten in die Listbox einfügen.

  3. Listbox leeren: Um die Listbox zu leeren, kannst du die RemoveItem-Methode verwenden. Hier ein Beispiel:

    With Me.ListBox1
       If .ListIndex > -1 Then
           Do While .ListCount > 0
               .RemoveItem (0)
           Loop
       End If
    End With
  4. Daten in die Listbox einfügen: Verwende die RowSource-Eigenschaft, um die Daten aus einem Array in die Listbox zu laden.

    Me.ListBox1.RowSource = "'[ArbeitsmappeTJ.xlsx]Tabelle1'!A2:M" & letzteZeileNeuesArray
  5. Dynamische Suchanpassung: Überprüfe, welche Textfelder oder Comboboxen gefüllt sind, und passe die Suchlogik entsprechend an.


Häufige Fehler und Lösungen

  • Listbox wird nicht geleert: Stelle sicher, dass du die RemoveItem-Methode in einer Schleife verwendest, um alle Einträge zu entfernen. Eine einfache clear-Methode funktioniert hier nicht, wenn du mehrere Daten hast.

  • Fehlermeldungen bei der Suche: Achte darauf, dass die Suchkriterien korrekt sind. Ein einfacher Tippfehler in den Daten kann dazu führen, dass kein Treffer gefunden wird.

  • Combobox funktioniert nicht wie erwartet: Überprüfe die ListIndex-Werte deiner Comboboxen. Manchmal kann ein Index 0 bedeuten, dass kein Wert ausgewählt ist.


Alternative Methoden

  • Listbox leeren mit ListIndex: Anstelle von RemoveItem kannst du auch den ListIndex nutzen, um gezielt Einträge zu löschen.

    If Me.ListBox1.ListIndex > -1 Then
       Me.ListBox1.RemoveItem Me.ListBox1.ListIndex
    End If
  • Verwendung von Clear: In einigen Fällen kann die Verwendung von Me.ListBox1.Clear funktionieren, allerdings kann dies bei mehrspaltigen Listboxen problematisch sein.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie die Listbox geleert und dann mit neuen Daten befüllt wird:

Private Sub CommandButton5_Click()
    ' Listbox leeren
    With Me.ListBox1
        Do While .ListCount > 0
            .RemoveItem (0)
        Loop
    End With

    ' Neue Daten laden
    Dim neueDaten As Variant
    neueDaten = Array("Eintrag 1", "Eintrag 2", "Eintrag 3")

    For i = LBound(neueDaten) To UBound(neueDaten)
        Me.ListBox1.AddItem neueDaten(i)
    Next i
End Sub

Tipps für Profis

  • Verwendung von multiselect: Wenn du mehrere Einträge aus der Listbox auswählen und entfernen möchtest, aktiviere MultiSelect in den Eigenschaften der Listbox. Nutze dann eine Schleife, um alle ausgewählten Elemente zu löschen.

  • Code optimieren: Reduziere die Anzahl der ElseIf-Bedingungen, indem du eine Datenstruktur wie ein Dictionary oder eine Collection verwendest, um die Suchparameter besser zu organisieren.


FAQ: Häufige Fragen

1. Wie kann ich die Listbox in Excel VBA leeren? Du kannst die Listbox mit der RemoveItem-Methode in einer Schleife leeren oder die Clear-Methode verwenden, wenn du nur eine Spalte hast.

2. Was mache ich, wenn die Combobox nicht funktioniert? Überprüfe die ListIndex-Werte und stelle sicher, dass die Daten korrekt in der Combobox geladen sind.

3. Wie kann ich die Leistung meiner Userform verbessern? Vermeide übermäßige Schleifen und bedingte Abfragen. Nutze effiziente Datenstrukturen und lade nur die benötigten Daten in die Listbox.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige