mreske
Goto Top

Listbox nach String der Reihe nach Suchen und markieren (SpinButton)

Hallo zusammen,
folgender Code markiert alle Zeilen einer Listbox, die in irgendeiner Spalte den String einer Textbox enthalten:

Private Sub CommandButton1_Click()
Dim lngRow As Long, lngColumn As Long
Dim strSearchText As String
If Trim$(txt_Suchbegriff.text) <> "" Then  
strSearchText = "*" & Trim$(txt_Suchbegriff.text) & "*"  

With Listbox1
.MultiSelect = fmMultiSelectMulti
For lngRow = 0 To .ListCount - 1
.Selected(lngRow) = False
For lngColumn = 0 To .ColumnCount - 1
If .List(lngRow, lngColumn) Like strSearchText Then
.Selected(lngRow) = True
Exit For
End If
Next
Next
End With
End If
End Sub

Soweit, so gut.

Hätte aber vielleicht jemand einen Tipp,
wie man den Code so in einem SpinButton einbauen kann,
dass durch klicken auf die Pfeile (SpinUp bzw. SpinDown) jeweils immer die nächste (bzw. vorherige) Zeile markiert wird?

Vielen Dank im Voraus
Gruß

Content-ID: 666949

Url: https://administrator.de/forum/listbox-nach-string-der-reihe-nach-suchen-und-markieren-spinbutton-666949.html

Ausgedruckt am: 26.12.2024 um 15:12 Uhr

colinardo
Lösung colinardo 21.05.2021, aktualisiert am 22.05.2021 um 13:19:37 Uhr
Goto Top
Servus @mreske,

hier mal ein Beispiel anhand dieser einfachen Test-Form (Namen der Controls in den Blasen):

screenshot

Und der dazu passende Code der Form (inkl. Kommentaren)
Option Compare Text
' Ergebnis collection  
Dim sResults As New Collection
' aktuelle Position in der Ergebnisliste  
Dim sResultsPos As Integer

' Suchen Button click Prozedur  
Private Sub btnSearch_Click()
    ' finde Einträge mit Funktion  
    Set sResults = FindStringsInListBox(txtSearch.Text)
    ' Wenn Suche erfolgreich  
    If sResults.Count <> 0 Then
        MsgBox "Ergebnis gefunden in " & sResults.Count & " Zeilen.", vbInformation  
        ' Initiale Position für Ergebnisse festlegen  
        sResultsPos = 0
        ' aktiviere SpinButton  
        sb.Enabled = True
        ' markiere automatisch das erste Ergebnis  
        sb_SpinDown
    Else    ' Suche ergebnislos  
        ' Markierung entfernen  
        lb.ListIndex = -1
        ' deaktiviere SpinButton  
        sb.Enabled = False
        MsgBox "Kein Eintrag gefunden!", vbExclamation  
    End If
End Sub

' SpinUp Button  
Private Sub sb_SpinUp()
    If sResults.Count = 0 Then Exit Sub
    ' Position in der Ergebnisliste festlegen  
    sResultsPos = IIf(sResultsPos > 1, sResultsPos - 1, sResults.Count)
    ' markiere Ergebnis in Listbox  
    lb.ListIndex = sResults(sResultsPos)
End Sub
'SpinDown Button  
Private Sub sb_SpinDown()
    If sResults.Count = 0 Then Exit Sub
    ' Position in der Ergebnisliste festlegen  
    sResultsPos = IIf(sResultsPos < sResults.Count, sResultsPos + 1, 1)
    ' markiere Ergebnis in Listbox  
    lb.ListIndex = sResults(sResultsPos)
End Sub
' Funktion zum finden von Einträgen in der Listbox  
Function FindStringsInListBox(strTerm) As Collection
    Dim colRows As New Collection, found As Boolean, r as long, c as Integer
    With lb
        For r = 0 To .ListCount - 1
            found = False
            For c = 0 To .ColumnCount - 1
                If .List(r, c) Like "*" & strTerm & "*" Then  
                    found = True
                End If
            Next
            If found Then colRows.Add r
        Next
    End With
    Set FindStringsInListBox = colRows
End Function
' bei Textänderung in Suchbox  
Private Sub txtSearch_Change()
    If txtSearch.Text = "" Then  
        btnSearch.Enabled = False
    Else
        btnSearch.Enabled = True
    End If
End Sub

Denke das solltest du anhand der Code-Kommentare an deine Bedürfnisse anpassen können falls nötig.

search_listbox_spin_button_666949.xlsm

Grüße Uwe
mreske
mreske 21.05.2021 um 18:29:25 Uhr
Goto Top
Hallo Uwe,
vielen vielen Dank dafür.
genau das habe ich gesucht.
Ja, den Code kann ich natürlich meinen Bedürfnissen anpassen.
Tausend dank und allen im Forum ein schönes, verlängertes Wochenende.
Gruß
mreske
mreske 22.05.2021 um 12:43:37 Uhr
Goto Top
Echt genial, funktioniert perfekt.
Musste nur r + c as integer deklariren und schon läuft es.
Tausend Dank dafür!!
colinardo
colinardo 22.05.2021 aktualisiert um 13:23:06 Uhr
Goto Top
Kommt davon wenn Option Explicit deaktiviert hat weil man wieder mal zu faul war zu deklarieren 😜.

Freut mich für dich.
Schönes Pfingstwochenende.

Grüße Uwe