Автоматический выбор из списка значений combobox при ручном вводе с клавиатуры
Модератор: Naeel Maqsudov
-
- Сообщения: 31
- Зарегистрирован: 28 мар 2014, 13:17
Есть такой вопрос. У меня есть заполненный множеством значений combobox. Я хочу чтобы при вводе в ручную с клавиатуры каких-то символов, букв и т.д. содержимое combobox автоматически фильтровалось, и при вводе каждой последующей буквы кол-во вариантов сокращалось, и в конце концов останется один вариант; или если я задам слово, не имеющееся в списке комбобокса то допустимых значений для выбора совсем предложено не будет.
Например, в комбобоксе след. слова:
стол
полет
стрела
лето
кофе
Я ввожу с клавиатуры в текстовом поле комбобокса букву "о". Список значений автоматически сократится до тех слов, в которых есть буква "о", т.е. останутся:
стол
полет
лето
кофе
потом дописываю, например, буквы "л", получаем "ол" и в списке остается только
стол
Но если я стираю символ, например "о", то у меня возвращаются в комбобокс слова содержащие "л", т.е чтобы операция происходила в "обе стороны".
Например, в комбобоксе след. слова:
стол
полет
стрела
лето
кофе
Я ввожу с клавиатуры в текстовом поле комбобокса букву "о". Список значений автоматически сократится до тех слов, в которых есть буква "о", т.е. останутся:
стол
полет
лето
кофе
потом дописываю, например, буквы "л", получаем "ол" и в списке остается только
стол
Но если я стираю символ, например "о", то у меня возвращаются в комбобокс слова содержащие "л", т.е чтобы операция происходила в "обе стороны".
Если нужен именно ComboBox, то :
Код: Выделить всё
Private iArrSource As Variant
Private Sub UserForm_Initialize()
iArrSource = Array("стол", "полет", "стрела", "лето", "кофе")
End Sub
Private Sub ComboBox1_Change()
Dim iSource As Variant, iFindText As Variant
With ComboBox1
iFindText = .Value: .Clear
If iFindText <> "" Then
For Each iSource In iArrSource
If InStr(1, iSource, iFindText, _
vbTextCompare) Then .AddItem iSource
Next
End If
.List = .List 'только для пользователей, которые
'осуществляют ввод при уже раскрытом списке и хотят
'наблюдать процесс подбора данных
End With
End Sub
-
- Сообщения: 31
- Зарегистрирован: 28 мар 2014, 13:17
Вы не могли бы объяснить эту строчку..
iFindText = .Value: .Clear
Уверен, что на этой строке у Вас возникает ошибка, ибо учитывая предыдущий топик, ComboBox1 Вы, скорее всего, заполняете с помощью свойства RowSource. Чего в данном примере, конечно же, делать не нужно.
Собственно, если я прав и Вы действительно мучаете свойство RowSource, то вот пример, где источником данных для ComboBox1 служит диапазон [C2:C10] рабочего листа с именем "Лист1"
Разумеется, вместо перебора всех элементов массива можно использовать поиск, т.е. методы Find + FindNext (см. свой первый топик)
Код: Выделить всё
Private iArrSource As Variant
Private Sub UserForm_Initialize()
'iArrSource = Array("стол", "полет", "стрела", "лето", "кофе")
iArrSource = Application.Range("Лист1!C2:C10").Value
ComboBox1.RowSource = "" 'изменить значения этих двух свойств можно вручную
ComboBox1.MatchEntry = fmMatchEntryNone 'причём один раз в дизайнере
ComboBox1.List = iArrSource
End Sub
Private Sub ComboBox1_Change()
Dim iSource As Variant, iFindText As Variant
With ComboBox1
iFindText = .Value: .List = Array() '.Clear
If iFindText <> "" Then
For Each iSource In iArrSource
If InStr(1, iSource, iFindText, _
vbTextCompare) Then .AddItem iSource
Next
.List = .List 'только для пользователей, которые
'осуществляют ввод при уже раскрытом списке и хотят
'наблюдать процесс подбора данных
Else
.List = iArrSource
End If
End With
End Sub
-
- Сообщения: 31
- Зарегистрирован: 28 мар 2014, 13:17
Код: Выделить всё
For Each iSource In iArrSource
Если ничего не трогать (за исключением, указания своего диапазона) то всё будет работать
так что, скорее всего, Вы внесли какую-нибудь отсебятину, например, не понимая зачем переменная iArrSource об'явлена на уровне модуля - просто удалили её или же об'явили в процедуре ComboBox1_Change, чего, естественно, делать не нужно.
так что, скорее всего, Вы внесли какую-нибудь отсебятину, например, не понимая зачем переменная iArrSource об'явлена на уровне модуля - просто удалили её или же об'явили в процедуре ComboBox1_Change, чего, естественно, делать не нужно.
-
- Сообщения: 31
- Зарегистрирован: 28 мар 2014, 13:17
я ничего не меняла за исключения диапозона
-
- Сообщения: 31
- Зарегистрирован: 28 мар 2014, 13:17
Private Sub UserForm_Initialize()
iArrSource = Application.Range("Наименование!B1:B480").Value
ComboBox1.RowSource = "" 'изменить значения этих двух свойств можно вручную
ComboBox1.MatchEntry = fmMatchEntryNone 'причём один раз в дизайнере
ComboBox1.List = iArrSource
End Sub
Private Sub ComboBox1_Change()
Dim iSource As Variant, iFindText As Variant
With ComboBox1
iFindText = .Value: .Clear
If iFindText <> "" Then
For Each iSource In iArrSource
If InStr(1, iSource, iFindText, _
vbTextCompare) Then .AddItem iSource
Next
End If
End With
End Sub
iArrSource = Application.Range("Наименование!B1:B480").Value
ComboBox1.RowSource = "" 'изменить значения этих двух свойств можно вручную
ComboBox1.MatchEntry = fmMatchEntryNone 'причём один раз в дизайнере
ComboBox1.List = iArrSource
End Sub
Private Sub ComboBox1_Change()
Dim iSource As Variant, iFindText As Variant
With ComboBox1
iFindText = .Value: .Clear
If iFindText <> "" Then
For Each iSource In iArrSource
If InStr(1, iSource, iFindText, _
vbTextCompare) Then .AddItem iSource
Next
End If
End With
End Sub
-
- Сообщения: 31
- Зарегистрирован: 28 мар 2014, 13:17
и пробовала так
Dim iSource As Variant
Private Sub UserForm_Initialize()
iArrSource = Application.Range("Наименование!B1:B480").Value
ComboBox1.RowSource = "" 'изменить значения этих двух свойств можно вручную
ComboBox1.MatchEntry = fmMatchEntryNone 'причём один раз в дизайнере
ComboBox1.List = iArrSource
End Sub
Private Sub ComboBox1_Change()
Dim iFindText As Variant
With ComboBox1
iFindText = .Value: .Clear
If iFindText <> "" Then
For Each iSource In iArrSource
If InStr(1, iSource, iFindText, _
vbTextCompare) Then .AddItem iSource
Next
End If
End With
End Sub
Dim iSource As Variant
Private Sub UserForm_Initialize()
iArrSource = Application.Range("Наименование!B1:B480").Value
ComboBox1.RowSource = "" 'изменить значения этих двух свойств можно вручную
ComboBox1.MatchEntry = fmMatchEntryNone 'причём один раз в дизайнере
ComboBox1.List = iArrSource
End Sub
Private Sub ComboBox1_Change()
Dim iFindText As Variant
With ComboBox1
iFindText = .Value: .Clear
If iFindText <> "" Then
For Each iSource In iArrSource
If InStr(1, iSource, iFindText, _
vbTextCompare) Then .AddItem iSource
Next
End If
End With
End Sub