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

Forumthread: Listbox über Textbox filtern

Listbox über Textbox filtern
24.08.2018 19:36:29
Pape
Hallo
ich bin neu hier im Forum und bzgl. VBA eher Anfänger.
Dank der vielen Beiträge habe ich mir einige Dinge "stricken" können, aber an folgendem Punkt komme ich nicht weiter:
In einer UserForm lade ich in eine Listbox mit mehreren Spalten Daten aus einer Tabelle - das klappt soweit.
Aber: wie kann ich nun eine Suchfunktion für die Listbox erstellen? Also bspw. eine Textbox, in die man ein Suchbegriff für eine Spalte in der Listbox eingibt und die Listbox dann automatisch gefiltert wird? Oder vielleicht konkreter: in meinem Fall stehen in der Spalte 2 Nachnamen. Wenn ich nun in der "Such-Textbox" den buchstaben "a" schreibe, möchte ich, dass die Listbox entsprechend nach Namen gefiltert wird, die mit "a" beginnen. Idealerweise dann fortlaufend, also bei "ab" Namen die mit "ab" beginnen usw.
mein Code zum Füllen der Listbox ist folgender:
Private Sub UserForm_Initialize()
Dim arrData As Variant, iLastRow As Integer
With Worksheets("Datensatz")
iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
arrData = .Range(.Cells(4, 1), .Cells(iLastRow, 9)).Value
End With
With ListBox1
.ColumnCount = 8
.ColumnWidths = "5cm;5cm;4cm;2cm;3cm;1,5cm;2cm;3cm;"
.ColumnHeads = False
.List() = arrData
.ListIndex = .ListCount - 1
End With
End Sub

Anzeige

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Listbox über Textbox filtern
24.08.2018 20:03:17
Nepumuk
Hallo,
teste mal:
Option Explicit

Private arrData As Variant

Private Sub CommandButton1_Click()
    ListBox1.List = arrData
    TextBox1.Text = vbNullString
End Sub

Private Sub TextBox1_Change()
    Dim lngIndex As Long
    With ListBox1
        For lngIndex = .ListCount - 1 To 0 Step -1
            If Not .List(lngIndex, 1) Like TextBox1.Text & "*" Then _
                Call .RemoveItem(lngIndex)
        Next
    End With
End Sub

Private Sub UserForm_Initialize()
    
    Dim lLastRow As Long
    
    With Worksheets("Datensatz")
        lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        arrData = .Range(.Cells(4, 1), .Cells(lLastRow, 9)).Value
    End With
    
    With ListBox1
        .ColumnCount = 8
        .ColumnWidths = "5cm;5cm;4cm;2cm;3cm;1,5cm;2cm;3cm"
        .List = arrData
        .ListIndex = .ListCount - 1
    End With
    
End Sub

Ich hab noch einen CommandButton eingefügt um den Filter zurückzusetzen.
Gruß
Nepumuk
Anzeige
AW: Listbox über Textbox filtern
24.08.2018 20:32:47
Pape
Hallo - vielen Dank für die Schnelle Antwort!
Leider klappts es irgendwie nicht - nach Änderung bekomme ich beim laden der Userform jetzt den Laufzeitfehler 1004 - Beim Debugger komme ich in einer anderen UserForm raus, von der aus man die UF aufruft, in die der Code eingegeben wurde.?
AW: Listbox über Textbox filtern
24.08.2018 20:35:30
Nepumuk
Hallo,
ohne die Mappe kann ich dir leider nicht sagen woran das liegt.
Gruß
Nepumuk
Anzeige
AW: Listbox über Textbox filtern
24.08.2018 22:14:57
Mathisen
Hallo,
zwei Nachfragen habe ich zum Code.
1. Beim Löschen eines Zeichens in der TextBox1 werden nicht mehr alle möglichen Datensätze angezeigt. Wie könnte man das ändern.
2. Ist es ohne großen Aufwand möglich als Datenquelle eine Access-Db zu benutzen und die Daten mittels DAO in ein Array einzulesen.
Vielleicht habt ihr für mich eine kleine Starthilfe.
Vielen Dank und schönes WE.
Gruß Mathisen
Anzeige
AW: Listbox über Textbox filtern
25.08.2018 15:42:50
Mathisen
Hallo,
habe die Lösung selbst gefunden.
Vielen Dank Mathisen
AW: Listbox über Textbox filtern
24.08.2018 20:16:03
Matthias
Moin!
Speicher dein arrData als globale Variable. Damit kannst du die List dann wieder neu füllen. Das ist notwendig, da du beim Löschen eines Buchstaben in der Textbox ja wieder mehr Felder haben musst. Spendiere der UF dann eine Textbox mit dieesm Code:
Private Sub TextBox1_Change()
Dim zeile As Long
Me.ListBox1.Clear
Me.ListBox1.List = arrData
For zeile = Me.ListBox1.ListCount - 1 To 0 Step -1
If Not Me.ListBox1.List(zeile, 1) Like Me.TextBox1 & "*" Then Me.ListBox1.RemoveItem (zeile) _
Next
End Sub

Bei Bedarf noch Application.Screenupdating hinzufügen. Also Beispiel hier noch ein Datei dazu:
https://www.herber.de/bbs/user/123542.xls
VG
Anzeige
AW: Listbox über Textbox filtern
24.08.2018 20:49:26
Pape
@Matthias
wie speichere ich denn meine arrData als globale Variable? Ich denke die Frage ist ggf. komisch, aber meine VBA - Kenntnisse reichen dafür nicht aus...
AW: Listbox über Textbox filtern
24.08.2018 21:27:10
Matthias
Moin!
Die Zeile
Dim arrData As Variant
ganz an den Anfang des Codes de UF schreiben und nicht ein eine Sub eingebunden. Schaue dir an sonsten mal die Datei an . Da ist das Beispiel lauffähig.
VG
Anzeige
AW: Listbox über Textbox filtern
24.08.2018 22:57:08
Pape
Hallo,
klappt einwandfrei - vielen lieben Dank!
Ich hab nur ewig gebraucht, bis ich darauf gekommen bin, dass der Filter zwischen Groß- und Kleinschreibung unterscheidet...
Könnte man das ändern - also dass ich bei der Eingabe von bspw. "a" in der Textbox auch die Ergebnisse in der Listbox bekomme die mit "A" anfangen?
Anzeige
AW: Listbox über Textbox filtern
25.08.2018 00:13:22
Werner
Hallo,
so:
If Not UCase(Me.ListBox1.List(zeile, 1)) Like UCase(Me.TextBox1) & "*" Then Me.ListBox1.RemoveItem (zeile)
Gruß Werner
AW: Listbox über Textbox filtern
27.08.2018 11:12:20
Pape
Hallo,
Suchfunktion funktioniert - auch mit Groß- und Kleinschreibung gleichzeitig...
folgendes Problem hat sich jetzt aber aufgetan: Die Daten aus der Listbox werden in verschiedene Text- und Comboboxen der UF eingelesen. Als Bezug habe ich mit "Listbox1.ListIndex" gearbeitet- das klappt nach wie vor, s.u. Code
Nach Bearbeitung der Daten in den Boxen werden sie an die entsprechende Stelle in die Excel-Tabelle zurückgespielt - über CommandButton1 und ebenfalls "ListBox1.ListIndex" als Bezug - das funktioniert jetzt aber nicht mehr - alle Änderungen landen in Zeile 4 in der Excel-Tabelle...
Kann mir jemand helfen?
Dim arrDAta As Variant
Private Sub TextBox14_Change()
' Suchfunktion für Listbox 1 über Textbox 14:
Dim zeile As Long
Me.ListBox1.Clear
Me.ListBox1.List = arrDAta
For zeile = Me.ListBox1.ListCount - 1 To 0 Step -1
If Not UCase(Me.ListBox1.List(zeile, 1)) Like UCase(Me.TextBox14) & "*" Then Me. _
ListBox1.RemoveItem (zeile)
Next
End Sub

Private Sub UserForm_Initialize()
'Listbox laden:
Dim iLastrow As Integer
With Worksheets("Tabelle1")
iLastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
arrDAta = .Range(.Cells(4, 1), .Cells(iLastrow, 24)).Value
End With
With ListBox1
.ColumnCount = 23
.ColumnWidths ="1,5cm;3,5cm;4cm;5cm;2cm;4cm;3,5cm;0cm;0cm;0cm;0cm;0cm;0cm;0cm;0cm;0cm; _
0cm_ 0cm;0cm;0cm;0cm;0cm;0cm;"
.ColumnHeads = False
.List() = arrDAta
.ListIndex = .ListCount - 1
End With

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
'Funktioniert: Datensatz in Textboxen laden über Doppelklick in Listbox
'Adressen
ComboBox1.Value = ListBox1.Column(0, ListBox1.ListIndex)
TextBox1.Value = ListBox1.Column(1, ListBox1.ListIndex)
TextBox2.Value = ListBox1.Column(2, ListBox1.ListIndex)
'... usw - ingesamt 23 Boxen
End Sub
Private Sub CommandButton1_Click()
‘Funtioniert NICHT (mehr): Datensätze aus Userform in Tabelle überspielen
With ActiveSheet.Range("A4:AA10000")
.Cells(ListBox1.ListIndex + 1, 1).Value = ComboBox1
.Cells(ListBox1.ListIndex + 1, 2).Value = TextBox1
.Cells(ListBox1.ListIndex + 1, 3).Value = TextBox2
End With
End Sub

Anzeige
AW: Listbox über Textbox filtern
27.08.2018 17:17:50
Pape
könnte es an der arrDAta liegen?
AW: Listbox über Textbox filtern
27.08.2018 17:23:23
Pape
Wenn man bei UserForm_Initialize auf die Festlegung der ArrData verzichtet, funktioniert der Bezug über ListIndex - allerdings die Suchfunktion über die Textbox nixht mehr...
AW: Listbox über Textbox filtern
27.08.2018 18:27:59
Werner
Hallo,
offensichtlich geht ja der Datenbereich deiner Tabelle bis Spalte X = 24. Also müsste Spalte Y = 25 ja frei sein und keine Daten enthalten.
Da würde ich dann beim UserForm_Initialize in Spalte Y die Formel =Zeile() die jeweilige Zeilennummer für den entsprechenden Datensatz erfassen.
Dann beim Einlesen der Daten ins Array die Spalte Y mit aufnehmen. So hast du zu jedem Datensatz auch die entsprechende Zeilennummer.
Dann die Listbox um eine Spalte erweitern. Die Zeilennummer aus dem Array in die zusätzliche Spalte der Listbox einlesen.
Eine zusätzliche Textbox (Textbox24) auf deine Userform und in den Eigenschaften diese Textbox auf Visible = False setzen, so dass die dir nicht angezeigt wird. In diese Textbox dann die Spaltennummer aus der Listbox übertragen.
Beim zurückschreiben hast du dann über diese Textbox24 Zugriff auf die entsprechende Zeile in der der Datensatz in deiner Tabelle steht.
Die Spalte mit der jeweiligen Zeilennummer kannst du in deiner Tabelle ja ausblenden.
Gruß Werner
Anzeige
AW: Listbox über Textbox filtern
27.08.2018 18:35:25
Pape
Habe beim tüftelt nun auch gemerkt, dass sich der ListIndex beim filtern jedes Mal ändert... Die Lösung mit der „Hilfsspalte“ wird’s wohl werden. Vielen Dank für die Hilfe!
Gerne u. Danke für die Rückmeldung. o.w.T.
28.08.2018 17:29:12
Werner
;
Anzeige
Anzeige

Infobox / Tutorial

Listbox über Textbox filtern in Excel VBA


Schritt-für-Schritt-Anleitung

Um eine Listbox in einer UserForm über eine Textbox zu filtern, benötigst du folgendes Vorgehen:

  1. UserForm erstellen: Lege eine UserForm an und füge eine Listbox (ListBox1) und eine Textbox (TextBox1) hinzu.

  2. Daten in die Listbox laden: Nutze den folgenden Code, um Daten aus einem Excel-Arbeitsblatt in die Listbox zu laden:

    Private Sub UserForm_Initialize()
       Dim arrData As Variant, iLastRow As Integer
       With Worksheets("Datensatz")
           iLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
           arrData = .Range(.Cells(4, 1), .Cells(iLastRow, 9)).Value
       End With
       With ListBox1
           .ColumnCount = 8
           .ColumnWidths = "5cm;5cm;4cm;2cm;3cm;1,5cm;2cm;3cm;"
           .List() = arrData
           .ListIndex = .ListCount - 1
       End With
    End Sub
  3. Textbox für die Suche implementieren: Füge den folgenden Code hinzu, um die Listbox beim Eintippen in die Textbox zu filtern:

    Private Sub TextBox1_Change()
       Dim lngIndex As Long
       With ListBox1
           .List = arrData  ' arrData muss global sein
           For lngIndex = .ListCount - 1 To 0 Step -1
               If Not .List(lngIndex, 1) Like TextBox1.Text & "*" Then
                   .RemoveItem (lngIndex)
               End If
           Next lngIndex
       End With
    End Sub
  4. Filter zurücksetzen: Füge einen Button hinzu, um den Filter zurückzusetzen:

    Private Sub CommandButton1_Click()
       TextBox1.Text = vbNullString
       Call UserForm_Initialize
    End Sub

Häufige Fehler und Lösungen

  • Laufzeitfehler 1004: Dieser Fehler tritt häufig auf, wenn der Bezug auf ein nicht existierendes Arbeitsblatt oder eine falsche Range verweist. Überprüfe, ob das Arbeitsblatt "Datensatz" korrekt benannt ist.

  • Nicht alle Datensätze werden angezeigt: Stelle sicher, dass arrData als globale Variable deklariert ist. Lege Dim arrData As Variant am Anfang des Codes fest.

  • Filter funktioniert nicht nach Löschen eines Zeichens: Achte darauf, dass du deinen Filter-Code so anpasst, dass er die gesamte Liste neu lädt, bevor er filtert.


Alternative Methoden

  • Access-Datenquelle: Du kannst auch eine Access-Datenbank als Quelle verwenden. Dazu benötigst du DAO (Data Access Objects). Mit DAO kannst du Daten in ein Array einlesen und die Listbox entsprechend füllen.

  • Excel-Funktionen: Alternativ kannst du Excel-Funktionen wie FILTER in neueren Excel-Versionen verwenden, um dynamische Filter zu erstellen.


Praktische Beispiele

Hier ist ein einfaches Beispiel für das Filtern von Nachnamen in einer Listbox:

  1. UserForm mit Listbox und Textbox erstellen.
  2. Daten in die Listbox laden.
  3. Textbox-Änderungen verwenden, um die Listbox zu filtern.

Nehmen wir an, du hast folgende Daten in Spalte B: "Müller", "Meier", "Schmidt". Wenn du "M" in die Textbox eingibst, sollte nur "Müller" und "Meier" in der Listbox angezeigt werden.


Tipps für Profis

  • Groß- und Kleinschreibung ignorieren: Um die Suche unabhängig von der Groß- und Kleinschreibung zu gestalten, kannst du den Code wie folgt anpassen:

    If Not UCase(Me.ListBox1.List(zeile, 1)) Like UCase(Me.TextBox1) & "*" Then
       Me.ListBox1.RemoveItem (zeile)
    End If
  • Performance optimieren: Verwende Application.ScreenUpdating = False vor dem Filtern und setze es nach dem Filter wieder auf True, um die Anzeige zu optimieren.


FAQ: Häufige Fragen

1. Wie speichere ich arrData als globale Variable?
Du musst die Zeile Dim arrData As Variant an den Anfang des Codes schreiben, außerhalb einer Sub.

2. Warum funktioniert der Filter nicht nach dem Löschen eines Buchstabens?
Stelle sicher, dass du die Listbox nach jedem Filtervorgang neu lädst, um die vollständige Datenbasis wiederherzustellen.

3. Kann ich auch mehrere Spalten filtern?
Ja, du kannst die Filterlogik erweitern, um mehrere Spalten zu berücksichtigen. Passe die Schleife in TextBox1_Change entsprechend an.

4. Wie kann ich den Filter zurücksetzen?
Füge einen CommandButton hinzu, der die TextBox leert und die Listbox neu mit arrData befüllt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige