Listenauswahl mit Tastencodes optimieren

Zeilen auswählen

Ist die Liste einmal geöffnet, kann der Benutzer durch Eingabe des ersten Zeichens eines Wertes in der ersten Spalte den entsprechenden Eintrag auswählen und die Auswahl mit den Pfeiltasten nach oben oder unten bewegen und mit [Strg]+[Pos1] beziehungsweise [Strg]+[Ende] zum ersten oder letzten Listeneintrag springen.

Was noch verbesserungswürdig ist, ist die Auswahl anhand von Werten in der zweiten oder einer anderen Spalte. Bei längeren Listen, beispielsweise zur Auswahl eines Kunden oder Artikels, kann die Auswahl über die Nummer, die meist in der ersten Spalte steht, ungünstig sein. Hier können Sie mit etwas VBA-Programmierung nachhelfen.

Sie benötigen dazu eine Funktion (Listing 3), die den passenden Listeneintrag in einem Listenfeld sucht und den gefundenen Eintrag als aktiven Eintrag festlegt. Wenn Sie die Funktion in mehreren Steuerelementen einsetzen möchten, sollten Sie das Steuerelement, die zu durchsuchende Spaltennummer und den zu suchenden Wert an die Funktion übergeben (Listing 3). Innerhalb der Funktion suchen Sie zunächst in der angegebenen Spalte nach einer exakten Überstimmung mit der Eingabe. Wird ein passender Eintrag gefunden, wird die Funktion verlassen, nachdem der Index und der Text für das Steuerelement gesetzt wurden. Andernfalls wird nach einer Zeile gesucht, in der der Wert der angegebenen Spalte mit der Eingabe beginnt. Falls hier eine Übereinstimmung gefunden wird, wird der Eintrag ebenfalls markiert.

Function getIndex(intSpalte As Integer, objContr As ComboBox, strWert As String)
Dim lngZeile As Long
'Exakte Übereinstimmung suchen
For lngZeile = 0 To objContr.ListCount - 1
If UCase(Trim(strWert)) = UCase(Trim(objContr.Column(intSpalte, _
lngZeile))) Then
getIndex = lngZeile
objContr.Text = objContr.Column(1, lngZeile)
objContr.ListIndex = lngZeile
Exit Function
End If
Next lngZeile
'Anfang des Wertes suchen
For lngZeile = 0 To objContr.ListCount - 1
If InStr(1, UCase(Trim(objContr.Column(intSpalte, lngZeile))), _
UCase(Trim(strWert))) = 1 Then
getIndex = lngZeile
objContr.ListIndex = lngZeile
objContr.Text = objContr.Column(1, lngZeile)
Exit Function
End If
Next lngZeile
End Function