Kontakt
DSVGO
Private Sub cmbXYZ_KeyUp(KeyCode As Integer, Shift As Integer) If KeyCode >= 48 Then ComboFind cmbXYZ End Subdafür, dass bei jedem Tastendruck (Cursor-Tasten u.ä. ausgefiltert) nach einen passenden Text gesucht wird. Die textuelle Suche erfolgt aus Performance-Gründen via API-Routine "SendMessage", die im Deklarationsteil eines Moduls deklariert wird:
Private Declare Function SendMessageA Lib "user32" ( _ ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) As Long Private Const CB_FINDSTRING = &H14CDie eigentliche Arbeit wird in der folgenden Prozedur gemacht. Zuerst wird der gewünschte Arbeitsmodus bestimmt; Die Routine erlaubt nämlich auch die Suche nach ItemData-Werten, die oft für IDs benutzt werden (s.a. ComboBox mit Daten aus MDB fülllen). Anschließend wird die entsprechende Suche durchgeführt:
Public Sub ComboFind( _ ByRef cmb As ComboBox, _ Optional ByVal Value As Variant) Dim i As Long Dim ID As Long Dim Text As String 'Modus bestimmen: If IsMissing(Value) Then 'Suche nach Combo-Eingabe Text = LCase$(cmb.Text) ElseIf IsNull(Value) Then 'Suche nach Null ID = 0 ElseIf IsNumeric(Value) Then 'Suche nach bestimmter ID ID = CLng(Value) Else 'Suche nach bestimmten Text Text = LCase$("" & Value) End If 'Vorab checken, ob Index bereits OK: i = cmb.ListIndex If i >= 0 Then If Len(Text) Then If LCase$(cmb.List(i)) = Text Then Exit Sub Else If cmb.ItemData(i) = ID Then Exit Sub End If End If With cmb If Len(Text) Then 'Nach Text suchen: i = SendMessageA(.hwnd, CB_FINDSTRING, -1, ByVal Text) If i >= 0 Then .ListIndex = i If IsMissing(Value) Then '"Angefügten" Text selektieren: .SelStart = Len(Text) .SelLength = Len(.Text) End If End If Else 'Nach ID suchen: For i = 0 To .ListCount - 1 If .ItemData(i) = ID Then .ListIndex = i Exit For End If Next i End If 'Len(Text) End With End Sub
© Jost Schwider, 08.10.2000-08.10.2000 - http://vb-tec.de/cmbfind.htm