Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: ListBox Zeile löschen

ListBox Zeile löschen
03.07.2018 13:03:29
Stephan
Hallo, ich habe eine ListBox die ich nach einem Begriff in einer TextBox durchsuchen lassen. Damit der Text nicht vollständig eingegeben werden muss, benutze ich die InStr Funktion.
Jetzt möchte ich alle Zeilen, in denen der Suchbegriff nicht vorkommt ausgeblendet haben. Mein Code dazu sieht folgenderweise aus:

Private Sub CommandButton_Suchen_Click()
Dim i As Integer, ii As Integer
For i = 0 To ListBox_Liste.ListCount - 1
For ii = 0 To ListBox_Liste.ColumnCount - 1
If InStr(ListBox_Liste.List(i, ii), TextBox1.Text) Then
Else
ListBox_Liste.RemoveItem
End If
Next
Next
End Sub

Allerdings werden die Zeilen nicht entfernt :( Jemand eine Idee was da falsch ist?
Liebe Grüße,
Stephan
Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ListBox Zeile löschen
03.07.2018 13:20:39
Daniel
Hi
1. Du musst die Indexnummer der Zeile, die gelöscht werden soll, auch angeben.
.RemoveItem i
2. nachdem du die Zeile gelöscht hast, musst du die Schleife über die Spalten (ii) mit Exit For abbrechen.
3. die Schleife über die Zeilen muss rückwärts laufen:
For i = Listbox1.Listcount -1 to 0 step - 1
Gruß Daniel
Anzeige
AW: ListBox Zeile löschen
03.07.2018 13:25:32
Stephan

Private Sub CommandButton_Suchen_Click()
Dim i As Integer, ii As Integer
For i = ListBox_Liste.ListCount - 1 To 0 Step -1
For ii = 0 To ListBox_Liste.ColumnCount - 1
If InStr(ListBox_Liste.List(i, ii), TextBox1.Text) Then
Else
ListBox_Liste.RemoveItem i
Exit For
End If
Next
Next
End Sub
So sieht das nun aus bei mir. Klappt aber immernoch nicht. Es tut sich gar nichts mehr. Ich verzweifel gleich :(
Anzeige
AW: ListBox Zeile löschen
03.07.2018 13:35:01
Daniel
Hi
ok die Zeile soll wohl gelöscht werden, wenn der Suchbegriff in keiner der Spalten vorkommt.
dann musst du zuerst die Werte zu einem Text zusammensetzen und dann erst das gesamte prüfen.
so wie es jetzt geschrieben ist, muss der gesuchte Begriff in jeder Spalte stehen, damit die Zeile "überlebt":
dim txt as string
For i = Listbox_Liste.ListCount - 1 to 0 step - 1
txt = ""
For ii = 0 to Listbox_Liste.List.column.count
txt =txt & "|" & Listbox_Liste.List(i, ii)
Next
if Instr(txt, Textbox1.Text = 0 then Listbox_liste.RemoveItem i
Next i

oder so, dh innere Schleife abbrechen, wenn Text gefunden wurde und dann löschen, wenn die innere Schleife vollständig durchlaufen wurde:
For i = Listbox_Liste.ListCount - 1 to 0 step - 1
For ii = 0 to Listbox_Liste.List.columncount
if Instr(Listbox_Liste(i, ii), Textbox1.Text) then Exit for
Next
if ii = Listbox_Liste.ColumnCount then Listbox_Liste.RemoveItem i
Next i
Gruß Daniel
Anzeige
Korrektur
03.07.2018 13:36:24
Daniel
korretkur:
ich war da etwas schnell
die innere Schleife muss lauten:
for ii = 0 to Listbox_liste.Columncount - 1
Gruß Daniel
AW: Korrektur
03.07.2018 13:41:25
Stephan
Jap, es funktioniert. Vielen Dank Daniel! :)
AW: ListBox Zeile löschen
03.07.2018 13:21:34
Nepumuk
Hallo Stephan,
du musst bei der RemoveItem-Methode die Zeilennummer angeben die gelöscht werden soll. Beispiel:
Private Sub CommandButton_Suchen_Click()
Dim i As Long, ii As Long
Dim blnFound As Boolean
With ListBox_Liste
    For i = 0 To .ListCount - 1
        blnFound = False
        For ii = 0 To .ColumnCount - 1
            If InStr(.List(i, ii), TextBox1.Text) <> 0 Then
                blnFound = True
                Exit For
            End If
        Next
        If Not blnFound Then Call .RemoveItem(i)
    Next
End Sub

Gruß
Nepumuk
Anzeige
Nachtrag
03.07.2018 13:24:09
Nepumuk
Ich nochmal,
gut dass Daniel aufgefallen ist dass die Schleife rückwärts laufen muss:
Private Sub CommandButton_Suchen_Click()
Dim i As Long, ii As Long
Dim blnFound As Boolean
With ListBox_Liste
    For i = .ListCount To 0 Step -1
        blnFound = False
        For ii = 0 To .ColumnCount Step -1
            If InStr(.List(i, ii), TextBox1.Text) <> 0 Then
                blnFound = True
                Exit For
            End If
        Next
        If Not blnFound Then Call .RemoveItem(i)
    Next
End Sub

Gruß
Nepumuk
Anzeige
AW: Nachtrag
03.07.2018 13:29:15
Stephan
Danke für deine Hilfe Nepumuk. Bei Call.RemoveItem(i) gibt er mir aber ein ungültiges Argument wieder. Wodran kann das denn liegen?
AW: Nachtrag
03.07.2018 13:37:09
Nepumuk
Hallo Stephan,
das hat doch gestern schon funktioniert:
Private Sub CommandButton_Suchen_Click()
    Dim lngRow As Long, lngColumn As Long
    Dim blnFound As Boolean
    Dim strText As String
    strText = TextBox1.Text
    With ListBox_Liste
        For lngRow = .ListCount - 1 To 0 Step -1
            blnFound = False
            For lngColumn = 0 To .ColumnCount - 1
                If InStr(1, .List(lngRow, lngColumn), strText) <> 0 Then
                    blnFound = True
                    Exit For
                End If
            Next
            If Not blnFound Then Call .RemoveItem(lngRow)
        Next
    End With
End Sub

Gruß
Nepumuk
Anzeige
AW: Nachtrag
03.07.2018 13:41:06
Stephan
Ja deswegen habe ich mich auch gewundet, weil ja eigentlich nur die letzte If Funktion verändert werden muss. Ich habe meinen Fehler aber jetzt gefunden, ich hatte einen Tippfehler bei der Deklartion der TextBox drin .... Danke nochmal für deine Hilfe! :)
AW: Nachtrag
03.07.2018 13:42:00
Nepumuk
Ich nochmal,
wenn du die Abfrage so gestaltest:
If InStr(1, .List(lngRow, lngColumn), strText, vbTextCompare)  0 Then

Dann spielt auch Klein/Großschreibung keine Rolle.
Gruß
Nepumuk
Anzeige
AW: Nachtrag
03.07.2018 13:54:19
Stephan
Perfekt! Vielen Dank genau danach habe ich gerade nämluch auch nochmal geschaut wie das hin hauen könnte :)
;
Anzeige
Anzeige

Infobox / Tutorial

ListBox Zeile löschen in Excel VBA


Schritt-für-Schritt-Anleitung

Um Zeilen in einer ListBox basierend auf einem Suchbegriff zu löschen, kannst du den folgenden VBA-Code verwenden. Dieser Code sucht nach einem Begriff, den der Benutzer in eine TextBox eingibt, und entfernt alle Zeilen aus der ListBox, die den Begriff nicht enthalten.

Private Sub CommandButton_Suchen_Click()
    Dim lngRow As Long, lngColumn As Long
    Dim blnFound As Boolean
    Dim strText As String
    strText = TextBox1.Text

    With ListBox_Liste
        For lngRow = .ListCount - 1 To 0 Step -1
            blnFound = False
            For lngColumn = 0 To .ColumnCount - 1
                If InStr(1, .List(lngRow, lngColumn), strText, vbTextCompare) <> 0 Then
                    blnFound = True
                    Exit For
                End If
            Next
            If Not blnFound Then
                .RemoveItem (lngRow)
            End If
        Next
    End With
End Sub

Dieser Code funktioniert in Excel 2010 und höher. Achte darauf, dass die ListBox und die TextBox korrekt benannt sind.


Häufige Fehler und Lösungen

  1. Ungültiges Argument bei RemoveItem: Dies kann passieren, wenn die Zeilennummer falsch ist oder die ListBox leer ist. Stelle sicher, dass du die richtige Zeilennummer übergibst und dass die ListBox nicht leer ist, bevor du versuchst, Elemente zu löschen.

  2. Schleifen laufen nicht richtig: Wenn die Schleifen nicht korrekt konfiguriert sind, kann das zu unvorhergesehenen Ergebnissen führen. Achte darauf, dass die äußere Schleife rückwärts läuft (von ListCount - 1 bis 0).


Alternative Methoden

Eine alternative Methode, um Zeilen zu filtern, besteht darin, die ListBox mit einer temporären Collection zu befüllen und anschließend die Collection an die ListBox zu übergeben. Dies kann die Performance verbessern, besonders bei großen Datenmengen.

Dim tempCollection As Collection
Set tempCollection = New Collection

For lngRow = 0 To ListBox_Liste.ListCount - 1
    Dim blnAdd As Boolean
    blnAdd = False
    For lngColumn = 0 To ListBox_Liste.ColumnCount - 1
        If InStr(1, ListBox_Liste.List(lngRow, lngColumn), strText, vbTextCompare) <> 0 Then
            blnAdd = True
            Exit For
        End If
    Next
    If blnAdd Then
        tempCollection.Add ListBox_Liste.List(lngRow)
    End If
Next

' Clear the ListBox and re-add filtered items
ListBox_Liste.Clear
For Each item In tempCollection
    ListBox_Liste.AddItem item
Next

Praktische Beispiele

Hier ist ein einfaches Beispiel, wie du eine ListBox mit einigen Werten füllen und dann den obigen Code verwenden kannst, um Zeilen zu filtern:

  1. Erstelle eine UserForm mit einer ListBox (ListBox_Liste) und einer TextBox (TextBox1).
  2. Fülle die ListBox mit Beispieldaten:
Private Sub UserForm_Initialize()
    ListBox_Liste.AddItem "Apfel"
    ListBox_Liste.AddItem "Banane"
    ListBox_Liste.AddItem "Kirsche"
    ListBox_Liste.AddItem "Dattel"
End Sub
  1. Verwende den Suchcode, um die ListBox basierend auf dem eingegebenen Text zu filtern.

Tipps für Profis

  • Fehlersuche: Nutze Debug.Print um Werte während der Ausführung zu überprüfen und um festzustellen, wo dein Code möglicherweise fehlschlägt.
  • Leistungsoptimierung: Wenn du mit großen Datenmengen arbeitest, vermeide es, die ListBox während der Schleifenoperationen zu aktualisieren. Stattdessen solltest du die Daten zuerst in einer Collection oder einem Array speichern und diese dann am Ende der Schleife in die ListBox übertragen.
  • Klein/Großschreibung ignorieren: Um die Suche nicht case-sensitiv zu gestalten, verwende vbTextCompare im InStr Funktionsaufruf.

FAQ: Häufige Fragen

1. Warum wird meine ListBox nicht aktualisiert?
Stelle sicher, dass du den richtigen Namen für die ListBox und die TextBox verwendest und dass der Code in der richtigen Subroutine ausgeführt wird.

2. Kann ich mehrere Suchbegriffe gleichzeitig verwenden?
Ja, du könntest die Eingabe in der TextBox durch Kommas trennen und dann jeden Begriff einzeln prüfen, bevor du die Zeile aus der ListBox entfernst.

3. Welche Excel-Versionen unterstützen diesen Code?
Der bereitgestellte Code funktioniert ab Excel 2010 und höher. Achte darauf, dass du die entsprechenden Objekte in deiner UserForm korrekt eingerichtet hast.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige