Нет способа заставить поле со списком вести себя таким образом, если вы не хотите его кодировать. Тем не менее, кодирование это не так уж плохо. Следующий код, возможно, можно улучшить (и, по крайней мере, добавить обработку ошибок), но он выполнит свою работу.
Предположим, у вас есть форма с полем со списком ComboBox1, а для свойств OnKeyDown
, OnKeyPress
и OnKeyUp
установлено значение [Event Procedure]
:
Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer)
Dim Cbo As ComboBox, i As Integer, Val As Variant, CurIndex As Integer
Set Cbo = Me.ActiveControl
Select Case KeyCode
Case vbKeyBack, vbKeyDelete
Cbo.Value = Null
Case Else
CurIndex = Cbo.ListIndex
For i = CurIndex + 1 To Cbo.ListCount - 1
If Left(Cbo.ItemData(i), 1) = Chr(KeyCode) Then
Cbo.Value = Cbo.ItemData(i)
Exit Sub
End If
Next i
For i = 0 To CurIndex
If Left(Cbo.ItemData(i), 1) = Chr(KeyCode) Then
Cbo = Cbo.ItemData(i)
Exit Sub
End If
Next i
End Select
KeyCode = StripKeyCode(KeyCode)
End Sub
Private Sub Combo1_KeyPress(KeyAscii As Integer)
KeyAscii = StripKeyCode(KeyAscii)
End Sub
Private Sub Combo1_KeyUp(KeyCode As Integer, Shift As Integer)
KeyCode = StripKeyCode(KeyCode)
End Sub
Private Function StripKeyCode(KeyCode As Integer) As Integer
Select Case KeyCode
Case vbKeyUp, vbKeyDown, vbKeyLeft, vbKeyRight, vbKeyTab, vbKeyF4
'Allow navigation keys to pass through
StripKeyCode = KeyCode
Case Else
StripKeyCode = 0
End Select
End Function
Я сомневаюсь, что производительность будет настолько велика в комбинированном ящике с кучей вариантов. Опять же, вам, вероятно, следует использовать эту технику только в ситуациях, когда количество элементов, начинающихся с одной и той же буквы, будет небольшим (например, менее 5).