Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1640to1644
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
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

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
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
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

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige