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

Forumthread: In ListBox suchen

In ListBox suchen
27.08.2007 14:54:56
Mike
Hallo zusammen.
Bei dem folgenden Code (hier aus dem Archiv. Danke dafür!)

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
Dim liSuche As Integer, liMsg As Integer, liSuche1 As Integer
For liSuche = 0 To ListBox1.ListCount - 1
For liSuche1 = 0 To ListBox1.ColumnCount - 1
If InStr(1, LCase(ListBox1.Column(liSuche1, liSuche)), LCase(TextBox1.Text)) _
> 0 Then
ListBox1.ListIndex = liSuche
End If
Next
Next
TextBox1.Text = ""
End If
End Sub


suche ich in einer ListBox über eine TextBox z. B. den Eintrag „mann“. Der Eintag wird in der Liste gefunden und markiert.
Das funktionier auch super. Jetzt meine Frage...
Wie kann ich mir mit dem Code alle Einträge die „mann“ enthalten in meiner ListBox anzeigen bzw. auflisten lassen?
Meine ListBox wird mit dem folgenden Code gefüllt.


Private Sub UserForm_initialize()
Dim i As Integer
Dim sh As Worksheet
Set sh = Sheets("Übersicht")
UserForm3.ListBox1.ColumnCount = 3
UserForm3.ListBox1.ColumnWidths = "0,0 cm; 1,8 cm; 5,5 cm"
For i = 4 To 103
If sh.Cells(i, 3) = "G" Then
ListBox1.AddItem sh.Cells(i, 2)                                     '2 = Spalte B
ListBox1.List(ListBox1.ListCount - 1, 1) = Left(sh.Cells(i, 2), 10) '2 = Spalte B
ListBox1.List(ListBox1.ListCount - 1, 2) = sh.Cells(i, 4)           '4 = Spalte D
End If
Next i
End Sub


Ich danke im voraus für Eure Hilfe!
Gruß, Mike

Anzeige

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: In ListBox suchen
27.08.2007 15:06:58
gerwas
Hallo
wenn die liste mehrfachauswahl zuläßt zuerst markieren und dann die markierung per schleife auslesen:
das markeiren geht so:

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
Dim liSuche As Integer, liMsg As Integer, liSuche1 As Integer
For liSuche = 0 To ListBox1.ListCount - 1
For liSuche1 = 0 To ListBox1.ColumnCount - 1
If InStr(1, LCase(ListBox1.Column(liSuche1, liSuche)), LCase(TextBox1.Text)) _
_
> 0 Then
ListBox1.ListIndex = liSuche
ListBox1.Selected(ListIndex)=True 
End If
Next
Next
TextBox1.Text = ""
End If
End Sub


mfg gerwas

Anzeige
AW: In ListBox suchen
27.08.2007 15:54:26
fcs
Hallo Mike,
mit folgender Anpassung werden alle Einträge die nicht den Eintrag in der Textbox enthalten aus der Liste entfernt.
Du könntest natürlich auch die Liste ähnlich wie im Initialisierungs-Code jeweils neu generieren und dabei die Zeilen überspringen, die den Eintrag in der Textbox nicht enthalten.
Gruß
Franz

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
Dim liSuche As Integer, liMsg As Integer, liSuche1 As Integer
Dim DeleteItem As Boolean
For liSuche = Listbox1.ListCount - 1 To 0
DeleteItem = True
For liSuche1 = 0 To Listbox1.ColumnCount - 1
If InStr(1, LCase(Listbox1.Column(liSuche1, liSuche)), LCase(TextBox1.Text)) _
> 0 Then
DeleteItem = False
Exit For
End If
Next
If DeleteItem = True Then
Listbox1.RemoveItem (liSuche)
End If
Next
TextBox1.Text = ""
End If
End Sub
Teilcode für neu generieren der Auswahlliste für die textbox:
Listbox1.Clear
For i = 4 To 103
If sh.Cells(i, 3) = "G" Then
If InStr(1, LCase(Left(sh.Cells(i, 2), 10)), LCase(TextBox1.Text)) > 0 _
Or InStr(1, LCase(sh.Cells(i, 4)), LCase(TextBox1.Text)) > 0 Then
Listbox1.AddItem sh.Cells(i, 2)                                     '2 = Spalte B
Listbox1.List(Listbox1.ListCount - 1, 1) = Left(sh.Cells(i, 2), 10) '2 = Spalte B
Listbox1.List(Listbox1.ListCount - 1, 2) = sh.Cells(i, 4)           '4 = Spalte D
End If
End If
Next i


Anzeige
AW: In ListBox suchen
27.08.2007 17:26:24
Mike
Vielen Dank für die schnelle Antwort!
@gerwas:
Die Mehrfachauswahl ist möglich, jedoch weiß ich nicht wie ich die Markierung per schleife auslesen kann?
@Franz
Es tut mit leid, jedoch bekomme ich bei der Anpassung kein vernünftiges Ergebnis!
1) bei "Private Sub TextBox1_KeyDown" markiert er nicht einmal mehr den Eintrag.
2) bei "Teilcode für neu generieren der Auswahlliste für die textbox:" ist eigentlich alles wie zuvor.
und bei beiden Anpassungen zusammen bleibt es wie bei Punkt 1.

Anzeige
AW: In ListBox suchen
28.08.2007 07:38:00
P@ulchen
Hallo Mike,
stelle die MultiSelect-Eigenschaft der ListBox auf 1 (fmMultiSelectMulti) und ersetze im Code Deiner Textbox1_KeyDown die Zeile
ListBox1.ListIndex = liSuche
durch
ListBox1.Selected(liSuche) = True
Gruß aus Leipzig
P@ulchen
www.excel-werkstatt.de

Anzeige
AW: In ListBox suchen
28.08.2007 10:25:12
Mike
Hi P@ulchen.
Das mit dem markieren funktioniert, ist aber leider nicht das Ergebnis was ich erzielen wollte.
Wenn ich in einer ListBox verschiedene Nummern habe, wie z. B. „1“ „3“ „5“ „4“ „5“ und gebe in meiner TextBox dann die 5 ein, möchte ich, dass er mir nur die beiden Zahlen 5 anzeigt. So ist es halt auch wenn ich „mann“ eingebe, sollte er mir die Einträge „Mustermann“ oder Mannschaft oder auch Mettmannhausen anzeigen. Der Rest sollte aus der
Listbox ausgeblendet werden. Und wenn die TextBox leer ist wieder meine Ursprungs Daten anzeigen.
Ich habe aus dem Archiv ein Beispiel gefunden, da funktioniert es aber leider nur mit dem Anfangsbuchstabe bzw. immer nur von links nach rechts.
Leider bekomme ich es nicht auf meinen Code umgebaut.
Ich hoffe es ist verständlich?
Jedoch… danke für Deine Hilfe. Denn das mit dem Markieren kann ich für eine andere Sache gut verwenden. :-)
Gruß, Mike

Anzeige
AW: In ListBox suchen
28.08.2007 11:07:00
P@ulchen
Hallo Mike,
dann so:

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim liSuche As Integer, liMsg As Integer, liSuche1 As Integer
Dim xVar As Boolean
If KeyCode = 13 Then
For liSuche = ListBox1.ListCount - 1 To 0 Step -1
xVar = False
For liSuche1 = ListBox1.ColumnCount - 1 To 0 Step -1
If InStr(1, LCase(ListBox1.Column(liSuche1, liSuche)), LCase(TextBox1.Text)) > 0  _
Then xVar = True
Next
If xVar = False Then ListBox1.RemoveItem (liSuche)
Next
TextBox1.Text = ""
End If
End Sub


Gruß aus Leipzig
P@ulchen
www.excel-werkstatt.de

Anzeige
AW: In ListBox suchen
28.08.2007 11:57:00
Mike
Hi P@ulchen.
Das ist es. Suuuper!
Jedoch ein Problem ergibt sich noch.
Wenn ich meine Eingabe gemacht habe, muss ich die Eingabetaste drücken, damit er mir die Einträge auch anzeigt. Dann kann ich aber nicht mehr nach einem anderen Eintrag suchen, da ja nur noch die gesuchten einträge und nicht die ganze Liste angezeigt wird.
Gibt es ne Möglichkeit, die suche so zu gestalten, dass wenn ich einen Begriff (ab 3 Buchstaben oder so) eingebe, mir die Suchergebnisse schon beim eingeben in der ListBox anzeigt werden und wenn ich die Buchstaben lösche er mir die liste zurück schreibt?
In etwa so, wie in diesem Beispiel! (https://www.herber.de/bbs/user/43484.xls)
Gruß, Mike

Anzeige
AW: In ListBox suchen
28.08.2007 10:51:00
gerwas
Hallo Mike
Leider habe ich eine kleinen Fehler in méiner Ergänzung gehabt. Hier nun nochmal der ganze Code:

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
Dim liSuche As Integer, liMsg As Integer, liSuche1 As Integer
For liSuche = 0 To ListBox1.ListCount - 1
For liSuche1 = 0 To ListBox1.ColumnCount - 1
If InStr(1, LCase(ListBox1.Column(liSuche1, liSuche)), _
LCase(TextBox1.Text)) > 0 Then
ListBox1.Selected(liSuche) = True
'hier war der fehler ListIndex
End If
Next
Next
TextBox1.Text = ""
End If
'bereits jetzt kannst du in der liste alle markierten einträge sehen,
'wenn du sie durchscrollst
liste_schreiben
End Sub


Sub liste_schreiben()
Worksheets.Add 'damit wir nichts überschreiben
k = 1
ActiveSheet.Cells(k, 1) = "Gefundene Datensätze"
Dim liSuche As Integer
For liSuche = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(liSuche) Then
k = k + 1
ActiveSheet.Cells(k, 1) = ListBox1.List(k) 'die Ausgabe mußt du noch anpassen
End If
Next
End Sub


mfg gerwas

Anzeige
AW: In ListBox suchen
28.08.2007 11:22:00
Mike
Hi gerwas.
Sorry, aber vielleicht drücke ich mich ja nicht richtig aus.
Ich möchte die Daten nicht in ein Arbeitsblatt schreiben. Ich möchte lediglich das er mir die Daten die ich in der ListBox suche auch in meiner ListBox anzeigt. Nicht die ganze Liste, sonder nur die gesuchten. Es funktioniert ja bei Archivbeispielen. Aber nicht mit einer Volltextsuche, sonder nur von links nach rechts bzw. per Anfangsbuchstabe.
Habe im Archiv mal ein Beispiel gefunden, welches mir sehr gut gefällt.
Hier der Beitrag:
https://www.herber.de/forum/archiv/880to884/t880205.htm
oder das Beispiel direkt:
https://www.herber.de/bbs/user/43484.xls
Danke! Gruß, Mike

Anzeige
AW: In ListBox suchen
28.08.2007 14:02:00
gerwas
o.k. dann versuchs mal hiermit:

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
Dim liSuche As Integer, liMsg As Integer, liSuche1 As Integer
For liSuche = 0 To ListBox1.ListCount - 1
If ListBox1.ListCount = liSuche Then Exit For
For liSuche1 = 0 To ListBox1.ColumnCount - 1
If InStr(1, LCase(ListBox1.Column(liSuche1, liSuche)), _
LCase(TextBox1.Text)) > 0 Then
ListBox1.Selected(liSuche) = True
End If
Next
                   If Not ListBox1.Selected(liSuche) Then
ListBox1.RemoveItem (liSuche)
liSuche = liSuche - 1
End If
               Next
TextBox1.Text = ""
End If
'bereits jetzt kannst du in der liste alle markierten einträge sehen, wenn du sie  _
durchscrollst
End Sub


mfg gerwas

Anzeige
AW: In ListBox suchen
28.08.2007 14:26:00
Mike
Hi!
Auch das funktioniert Super!
Jedoch wie schon P@ulchen beschrieben, gibt es noch ein Problem.
Wenn ich meine Eingabe gemacht habe, muss ich die Eingabetaste drücken, damit er mir die Einträge auch anzeigt. Dann kann ich aber nicht mehr nach einem anderen Eintrag suchen, da ja nur noch die gesuchten einträge und nicht die ganze Liste angezeigt wird.
Gibt es ne Möglichkeit, die suche so zu gestalten, dass wenn ich zurück in die TextBox springe, dass er mir die Liste zurück schreibt und/oder bei einer Eingabe mir die Suchergebnisse schon beim eingeben in der ListBox anzeigt werden.
In etwa so, wie in dem Beispiel!
Gruß, Mike

Anzeige
AW: In ListBox suchen
28.08.2007 15:06:06
gerwas
Es gibt immer mindestens zwei Möglichkeiten...
eine ist die hier: per Mausklick auf die TextBox wird die Liste neu gefüllt, geht auch mit einem anderen Ereignis oder einem Commandbutton.
(alle macros in die Userform kopieren und ev. vorhandene ersetzen)

Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As  _
Single, ByVal Y As Single)
UserForm3.ListBox1.Clear
liste_füllen
End Sub



Private Sub UserForm_initialize()
UserForm3.ListBox1.ColumnCount = 3
UserForm3.ListBox1.ColumnWidths = "0,0 cm; 1,8 cm; 5,5 cm"
liste_füllen
End Sub


Sub liste_füllen()
Dim i As Integer
Dim sh As Worksheet
Set sh = Sheets("Übersicht")
For i = 4 To 103
If sh.Cells(i, 3) = "G" Then
ListBox1.AddItem sh.Cells(i, 2) '2 = Spalte B
ListBox1.List(ListBox1.ListCount - 1, 1) = Left(sh.Cells(i, 2), 10) '2 = Spalte B
ListBox1.List(ListBox1.ListCount - 1, 2) = sh.Cells(i, 4) '4 = Spalte D
End If
Next i
End Sub


;-)) Gerwas

Anzeige
AW: In ListBox suchen
28.08.2007 22:11:59
Mike
Hi Gerwas, @P@ulchen.
Konnte alles sehr gut umsetzten. Klapp Super!
Vielen lieben Dank für Eure Hilfe.
Gruß, Mike
;
Anzeige

Infobox / Tutorial

In ListBox suchen und filtere Ergebnisse in Excel


Schritt-für-Schritt-Anleitung

  1. UserForm und ListBox erstellen:

    • Füge eine UserForm in deinem Excel-Projekt hinzu.
    • Platziere eine ListBox (ListBox1) und eine TextBox (TextBox1) auf der UserForm.
  2. ListBox initialisieren:

    • Verwende den folgenden Code, um die ListBox mit Daten zu füllen:
    Private Sub UserForm_Initialize()
       Dim i As Integer
       Dim sh As Worksheet
       Set sh = Sheets("Übersicht")
       ListBox1.ColumnCount = 3
       ListBox1.ColumnWidths = "0,0 cm; 1,8 cm; 5,5 cm"
       For i = 4 To 103
           If sh.Cells(i, 3) = "G" Then
               ListBox1.AddItem sh.Cells(i, 2)                                     '2 = Spalte B
               ListBox1.List(ListBox1.ListCount - 1, 1) = Left(sh.Cells(i, 2), 10) '2 = Spalte B
               ListBox1.List(ListBox1.ListCount - 1, 2) = sh.Cells(i, 4)           '4 = Spalte D
           End If
       Next i
    End Sub
  3. Suchfunktion in der TextBox aktivieren:

    • Implementiere die Suchfunktion durch den folgenden Code in der TextBox:
    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
       If KeyCode = 13 Then
           Dim liSuche As Integer, liSuche1 As Integer
           For liSuche = ListBox1.ListCount - 1 To 0 Step -1
               Dim xVar As Boolean
               xVar = False
               For liSuche1 = 0 To ListBox1.ColumnCount - 1
                   If InStr(1, LCase(ListBox1.Column(liSuche1, liSuche)), LCase(TextBox1.Text)) > 0 Then
                       xVar = True
                   End If
               Next
               If Not xVar Then ListBox1.RemoveItem (liSuche)
           Next
           TextBox1.Text = ""
       End If
    End Sub
  4. Suchergebnisse dynamisch anzeigen:

    • Um die Suchergebnisse beim Tippen anzuzeigen, kannst du die gleiche Logik wie oben verwenden, jedoch ohne die Eingabetaste zu verwenden. Dies kannst du zum Beispiel im TextBox1_Change-Ereignis umsetzen:
    Private Sub TextBox1_Change()
       Dim liSuche As Integer, liSuche1 As Integer
       For liSuche = ListBox1.ListCount - 1 To 0 Step -1
           Dim xVar As Boolean
           xVar = False
           For liSuche1 = 0 To ListBox1.ColumnCount - 1
               If InStr(1, LCase(ListBox1.Column(liSuche1, liSuche)), LCase(TextBox1.Text)) > 0 Then
                   xVar = True
               End If
           Next
           If Not xVar Then ListBox1.RemoveItem (liSuche)
       Next
    End Sub

Häufige Fehler und Lösungen

  • Problem: Die ListBox zeigt keine Ergebnisse an.

    • Lösung: Stelle sicher, dass die Spaltenanzahl der ListBox und die Spaltenbreiten korrekt eingestellt sind.
  • Problem: Suchergebnisse erscheinen erst nach Drücken der Eingabetaste.

    • Lösung: Verwende das TextBox1_Change-Ereignis, um die Suchergebnisse während des Tippens anzuzeigen.

Alternative Methoden

  • Mausklick auf die TextBox: Du kannst die ListBox auch bei einem Mausklick auf die TextBox neu füllen. Hier ist der Code dafür:

    Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
       ListBox1.Clear
       Call liste_füllen
    End Sub
  • CommandButton hinzufügen: Ein Button kann ebenfalls verwendet werden, um die Liste neu zu laden oder die Suchfunktion zu aktivieren.


Praktische Beispiele

  1. Volltextsuche in der ListBox: Um alle Einträge anzuzeigen, die ein bestimmtes Wort enthalten, verwende die oben genannten Codes in Kombination mit dem TextBox1_Change-Ereignis.

  2. Daten aus einer Excel-Tabelle filtern: Nutze den UserForm_Initialize-Code, um die Daten aus einer Excel-Tabelle zu ziehen und in die ListBox zu befüllen.


Tipps für Profis

  • Performance verbessern: Deaktiviere die Bildschirmaktualisierung während der Suche, um die Performance zu erhöhen:

    Application.ScreenUpdating = False
    '... dein Code hier ...
    Application.ScreenUpdating = True
  • Erweiterte Suchfunktionen: Implementiere eine Filterung nach mehreren Kriterien, indem du mehrere TextBoxen hinzufügst und die Eingaben kombinierst.


FAQ: Häufige Fragen

1. Wie kann ich die ListBox mehrmals durchsuchen? Um die Liste mehrfach zu durchsuchen, setze den Code im TextBox1_Change-Ereignis ein, damit die Liste während der Eingabe aktualisiert wird.

2. Ist es möglich, die Liste nach mehreren Kriterien zu filtern? Ja, du kannst mehrere TextBoxen verwenden und die Suchlogik entsprechend anpassen, um die Einträge basierend auf allen Eingaben zu filtern.

3. Warum sehe ich manchmal keine Daten in der ListBox? Überprüfe, ob die Daten im Quellblatt vorhanden sind und dass die Bedingungen im UserForm_Initialize-Code erfüllt sind (z. B. If sh.Cells(i, 3) = "G").

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