ListBox durchsuchen

Michelle1292

Grünschnabel
Hallo zusammen,

ich habe eine ListBox erstellt mit insgesamt 196 Ländern, welche ausgewählt werden können und dann in ein Word Formular übertragen werden. Durch die Anzahl der Auswahlmöglichkeiten ist das Ganze etwas unübersichtlich und ich würde gerne eine Suchfunktion einbauen. Mir der von mir gewählten Programmierung klappt es nicht so wie ich mir das vorstelle. Ich kann nur nach vollständiger Übereinstimmung suchen (z.B. wenn ich "Deutschland" eingebe). Ich würde allerdings auch gerne nach Teilübereinstimmungen (z.B. "Deu") suchen können. Kann mir jemand sagen was ich falsch mache?
Achtung: Ich bin blutiger Anfänger, wenn ihr mir helfen könnt dann bitte eine Erklärung für Dummies :)

So funktioniert die Suche, allerdings nur bei vollständiger Übereinstimmung:

Private Sub TextBox1_Change()
Dim myTxt As String, i as Integer
myTxt = UCase(TextBox1.Text)
For i = 0 ListBox1.ListCount -1
If myTxt = UCase(ListBox1.List(i)) Then Exit For / *
Next
If i < ListBox1.ListCount Then ListBox1.ListIndex = i
End Sub

*Wenn ich den Code hier abänder in "If myTxt <= UCase(ListBox1.List(i)) Then Exit For" funktioniert die Suche gar nicht mehr

Für Hilfe wäre ich wirklich sehr dankbar! :)

Viele Grüße

Michelle
 

Yaslaw

n/a
Moderator
Bitt in Zukunft angeben in was du das Programmierst. Ist es VB6 oder VBA?
Wenn VBA, welches Programm. MS Access, Excel, Word?

Aber für einen Vergleich auf Deu für Deutschland musst du nicht mit > arbeiten. Sondern mit LIKE denn "A" ist ebenfalls <= als "DEUTSCHLAND"

Visual Basic:
'Am Ende noch ein * hinzufügen, für den LIKE
myTxt = UCase(TextBox1.Text) & "*"
For i = 0 ListBox1.ListCount -1
    'Hier muss die Logik umgedreht werden: "DEUTSCHLAND" LIKE "DEU*"
    If UCase(ListBox1.List(i)) Like myText Then Exit For
Next
 

Michelle1292

Grünschnabel
Vielen lieben Dank für deine schnelle Hilfe, es hat funktioniert! Die Erklärung ist natürlich einleuchtend. In Zukunft werde ich auch genauer angeben, wo ich die Programmierung hinterlegt haben möchte.

Viele Grüße

Michelle
 

Michelle1292

Grünschnabel
Jetzt hätte ich doch noch einmal eine Frage: Leider findet er immer nur den ersten Eintrag der eine Übereinstimmung aufweist :(

Um mein Versäumnis nachzuholen: Die Programmierung ist in VBA, Word 2010
 

Yaslaw

n/a
Moderator
Jepp. Das ist so. Wie willst du auf die Zweite kommen?
Oder willst du die Auswahl eingrenzen?
 

Michelle1292

Grünschnabel
Zuerst: ich habe deinen Code leicht modifiziert damit sich die Suche nicht nur nach den Anfangsbuchstaben richtet ([...] myTxt = "*" & UCase(Textbox1.Text) & "*" [...]) ich möchte das er mir alle Übereinstimmungen findet, beispielsweise kommt in der Liste "Republik Korea (Südkorea)" vor und "Südafrika". Wenn ich nun den Suchbegriff "Süd" eingebe findet er mir als erstes Südkorea und ich möchte das er bei Eingabe von Tap weiterspringt zu Südafrika. Ich hatte überlegt ob man da mit einer Schleife lösen kann, allerdings bin ich mit meinem Versuch das zu programmieren immer in einer Endlosschleife gelandet...mir fehlt hier einfach die Erfahrung und auch das Know-how.
 

Yaslaw

n/a
Moderator
Mit tab auf welchem Feld?
Du hast ein Eingabefeld und ein Listenfeld. Beim eingeben in das Eingabefeld springt er beim Listenfeld auf den ersten passenden Eintrag.
Auf welchem Feld bist du, wenn du Tab drücken willst?
Und denk dran, die meisten Formulare verwenden Tab um den Fokus zum nächsten Feld zu setzen.
 

Michelle1292

Grünschnabel
Die Enter-Taste wäre wohl klüger in dem Fall...
Ich befinde mich im Eingabefeld, gebe dort den Suchbegriff ein und verwende dann Enter und springe dadurch zur ersten Übereinstimmung. Soweit funktioniert es bisher. Wenn ich jetzt noch eimal Enter drücke hätte ich gerne die nächste Übereinstimmung USW.
 

Yaslaw

n/a
Moderator
Ich habe mir schnell einen Test in MS Access mit einer einfachen ListBox
Mit Tab auf dem Eingabefeld sucht er weiter. Das kann natürlich noch angepasst werden

Visual Basic:
Private lastIdx As Long

Private Function search(Optional ByVal iStartPos As Long = -1) As Long
    Dim i As Long
    
    'Auswahl zurücksetzen
    ListBox1 = Null
    search = iStartPos
    
    'Alle Items durchgehen und EIntrag suchen
    For i = iStartPos + 1 To ListBox1.ListCount - 1
        If UCase(ListBox1.ItemData(i)) Like UCase(TextBox1.text) & "*" Then
            ListBox1 = ListBox1.ItemData(i)
            search = i
            Exit For
        End If
    Next
    'wieder von vorne beginnen, falls vorher bereits etwas gefunden wurde, jetzt aber nicht mehr
    If iStartPos <> -1 And search = iStartPos Then
        search = search()
    End If
End Function

Private Sub TextBox1_Change()
    'Suche von Anfang an beginnen
    lastIdx = search()
End Sub

Private Sub TextBox1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyTab Then
        'Suche fortführen
        lastIdx = search(lastIdx)
        'Tab abbrechen
        KeyCode = 0
    End If
End Sub
 

Neue Beiträge