Страница 1 из 2

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

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

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

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

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

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

стол

Но если я стираю символ, например "о", то у меня возвращаются в комбобокс слова содержащие "л", т.е чтобы операция происходила в "обе стороны".

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

Добавлено: 10 май 2014, 20:04
pashulka
Если нужен именно 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

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

Добавлено: 10 май 2014, 20:54
Настя Белова
Вы не могли бы объяснить эту строчку..
iFindText = .Value: .Clear

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

Добавлено: 10 май 2014, 21:26
pashulka
Уверен, что на этой строке у Вас возникает ошибка, ибо учитывая предыдущий топик, ComboBox1 Вы, скорее всего, заполняете с помощью свойства RowSource. Чего в данном примере, конечно же, делать не нужно.

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

Добавлено: 10 май 2014, 21:50
pashulka
Собственно, если я прав и Вы действительно мучаете свойство 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 (см. свой первый топик)

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

Добавлено: 12 май 2014, 17:53
Настя Белова

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

For Each iSource In iArrSource
теперь тут ошибка

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

Добавлено: 12 май 2014, 19:31
pashulka
Если ничего не трогать (за исключением, указания своего диапазона) то всё будет работать
так что, скорее всего, Вы внесли какую-нибудь отсебятину, например, не понимая зачем переменная iArrSource об'явлена на уровне модуля - просто удалили её или же об'явили в процедуре ComboBox1_Change, чего, естественно, делать не нужно.

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

Добавлено: 13 май 2014, 18:23
Настя Белова
я ничего не меняла за исключения диапозона

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

Добавлено: 13 май 2014, 18:26
Настя Белова
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

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

Добавлено: 13 май 2014, 18:28
Настя Белова
и пробовала так
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