Автоматический выбор из списка значений combobox при ручном вводе с клавиатуры

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Настя Белова
Сообщения: 31
Зарегистрирован: 28 мар 2014, 13:17

Есть такой вопрос. У меня есть заполненный множеством значений combobox. Я хочу чтобы при вводе в ручную с клавиатуры каких-то символов, букв и т.д. содержимое combobox автоматически фильтровалось, и при вводе каждой последующей буквы кол-во вариантов сокращалось, и в конце концов останется один вариант; или если я задам слово, не имеющееся в списке комбобокса то допустимых значений для выбора совсем предложено не будет.
Например, в комбобоксе след. слова:

стол
полет
стрела
лето
кофе

Я ввожу с клавиатуры в текстовом поле комбобокса букву "о". Список значений автоматически сократится до тех слов, в которых есть буква "о", т.е. останутся:

стол
полет
лето
кофе

потом дописываю, например, буквы "л", получаем "ол" и в списке остается только

стол

Но если я стираю символ, например "о", то у меня возвращаются в комбобокс слова содержащие "л", т.е чтобы операция происходила в "обе стороны".
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Если нужен именно 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
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Уверен, что на этой строке у Вас возникает ошибка, ибо учитывая предыдущий топик, ComboBox1 Вы, скорее всего, заполняете с помощью свойства RowSource. Чего в данном примере, конечно же, делать не нужно.
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Собственно, если я прав и Вы действительно мучаете свойство RowSource, то вот пример, где источником данных для ComboBox1 служит диапазон [C2:C10] рабочего листа с именем "Лист1"

Код: Выделить всё

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
Разумеется, вместо перебора всех элементов массива можно использовать поиск, т.е. методы Find + FindNext (см. свой первый топик)
Настя Белова
Сообщения: 31
Зарегистрирован: 28 мар 2014, 13:17

Код: Выделить всё

For Each iSource In iArrSource
теперь тут ошибка
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Если ничего не трогать (за исключением, указания своего диапазона) то всё будет работать
так что, скорее всего, Вы внесли какую-нибудь отсебятину, например, не понимая зачем переменная 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
Настя Белова
Сообщения: 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
Ответить