Users often complain that listboxes don’t have the same multiple keypress search capabilities as treeviews and other objects. But you can simulate this behavior by adding code to a form with a timer and a listbox whose Sorted property is set to True.
For this test, Form_Load adds some data and sets the default interval between keystrokes. You can type in “AL” to get to Allan instead of the first instance of an entry with an “a” in the list. This can be extremely helpful in long lists. You can also convert this code easily for use within a custom control:
Option ExplicitPrivate Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal hwnd As Long, _ ByVal wMsg As Long, ByVal wParam As Long, _ lParam As Any) As LongPrivate Const LB_FINDSTRING = &H18FPrivate Const LB_ERR = (-1)Private sSearchstring As StringPrivate Sub Form_Load() With List1 .AddItem "Adam" .AddItem "Allan" .AddItem "Arty" .AddItem "Aslan" .AddItem "Barney" .AddItem "Bob" End With Timer1.Interval = 2000End SubPrivate Sub List1_KeyPress(KeyAscii As Integer) Dim nResult As Long Timer1.Enabled = True sSearchstring = sSearchstring & Chr$(KeyAscii) With List1 nResult = SendMessage(.hWnd, LB_FINDSTRING, _ .ListIndex, ByVal sSearchstring) If nResult <> LB_ERR Then .ListIndex = nResult KeyAscii = 0 End If End WithEnd SubPrivate Sub Timer1_Timer() sSearchstring = "" Timer1.Enabled = FalseEnd Sub