Автозаполнение TextBox из ListBox
Добавлено: 09 мар 2014, 12:27
Доброго времени суток, у меня такая проблема сейчас пишу практику и учусь работе на VBA. Есть ListBox в который загружается название листов, и организован поиск по TextBox таким образом, что вводимое значение выделяется в ListBox.
Проблема состоит в следующем: Я хочу сделать автозаполнение в TextBox при вводе первой или более букв чтобы программа смотрела в ListBox и предлогала вариант заполнения.
Много пробывал и искал, в основном на англоязычных форумах, но английский на начальном уровне поэтому многого не понял. Вот код (не мой, найден) как его изменить под меня?
Option Explicit
#If Win32 Then ' 32-разрядная версия VB
Private Const LB_FINDSTRING = &H18F
Private Declare Function SendMessage Lib _
"User32" Alias "SendMessageA" (ByVal hWnd _
As Long, ByVal wMsg As Long, ByVal wParam _
As Long, lParam As _ Any) As Long
#Else ' 16-разрядная версия VB
Private Const WM_USER = &H400
Private Const LB_FINDSTRING = (WM_USER + 16)
Private Declare Function SendMessage Lib _
"User" (ByVal hWnd As Integer, ByVal wMsg _
As Integer, ByVal wParam As Integer, lParam _
As Any) As Long
#End If
Private Sub Form_Load()
List1.AddItem "Апельсин"
List1.AddItem "Банан"
List1.AddItem "Яблоко"
List1.AddItem "Персик"
List1.AddItem "Ананас"
List1.AddItem "Авокадо"
End Sub
Private Sub Text1_Change()
Dim pos As Long
List1.ListIndex = SendMessage(List1.hWnd, _
LB_FINDSTRING, -1, ByVal CStr(Text1.Text))
If List1.ListIndex = -1 Then
pos = Text1.SelStart
Else
pos = Text1.SelStart
Text1.Text = List1
Text1.SelStart = pos
Text1.SelLength = Len(Text1.Text) - pos End If
End Sub
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
'
On Error Resume Next
If KeyCode = 8 Then ' Backspace
If Text1.SelLength <> 0 Then
Text1.Text = Mid$(Text1, 1, Text1.SelStart - 1)
KeyCode = 0
End If
ElseIf KeyCode = 46 Then ' Del
If Text1.SelLength <> 0 And _
Text1.SelStart <> 0 Then
KeyCode = 0
End If
End If
End Sub
Он не работает ругается на Private Sub Text1_Change(), Возможно надо везде поменять на Text1 = TextBox1 , List1 = ListBox1. Но все равно выдает ошибку. Не судите строго.
Проблема состоит в следующем: Я хочу сделать автозаполнение в TextBox при вводе первой или более букв чтобы программа смотрела в ListBox и предлогала вариант заполнения.
Много пробывал и искал, в основном на англоязычных форумах, но английский на начальном уровне поэтому многого не понял. Вот код (не мой, найден) как его изменить под меня?
Option Explicit
#If Win32 Then ' 32-разрядная версия VB
Private Const LB_FINDSTRING = &H18F
Private Declare Function SendMessage Lib _
"User32" Alias "SendMessageA" (ByVal hWnd _
As Long, ByVal wMsg As Long, ByVal wParam _
As Long, lParam As _ Any) As Long
#Else ' 16-разрядная версия VB
Private Const WM_USER = &H400
Private Const LB_FINDSTRING = (WM_USER + 16)
Private Declare Function SendMessage Lib _
"User" (ByVal hWnd As Integer, ByVal wMsg _
As Integer, ByVal wParam As Integer, lParam _
As Any) As Long
#End If
Private Sub Form_Load()
List1.AddItem "Апельсин"
List1.AddItem "Банан"
List1.AddItem "Яблоко"
List1.AddItem "Персик"
List1.AddItem "Ананас"
List1.AddItem "Авокадо"
End Sub
Private Sub Text1_Change()
Dim pos As Long
List1.ListIndex = SendMessage(List1.hWnd, _
LB_FINDSTRING, -1, ByVal CStr(Text1.Text))
If List1.ListIndex = -1 Then
pos = Text1.SelStart
Else
pos = Text1.SelStart
Text1.Text = List1
Text1.SelStart = pos
Text1.SelLength = Len(Text1.Text) - pos End If
End Sub
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
'
On Error Resume Next
If KeyCode = 8 Then ' Backspace
If Text1.SelLength <> 0 Then
Text1.Text = Mid$(Text1, 1, Text1.SelStart - 1)
KeyCode = 0
End If
ElseIf KeyCode = 46 Then ' Del
If Text1.SelLength <> 0 And _
Text1.SelStart <> 0 Then
KeyCode = 0
End If
End If
End Sub
Он не работает ругается на Private Sub Text1_Change(), Возможно надо везде поменять на Text1 = TextBox1 , List1 = ListBox1. Но все равно выдает ошибку. Не судите строго.