Имеем: Список уникальный значений (подойдет для работы с фамилиями) и Combobox на листе(1) Что хотим: при щелчке на Combobox раскрывается список взятый с листа, затем по мере ввода текста, из этого списка удаляются строки которые не соответствуют введенному тексту. Что не делает: не сортирует и не удаляет повторы, не добавляет в базовый список введенные значения - есть куда стремиться
вот код:
Код
Sub ComboBox1_GotFocus()
ComboBox1.Value = ""
ComboBox1.Clear
ComboBox1.MatchEntry = fmMatchEntryNone
new_list
ComboBox1.DropDown
End Sub
Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 38 Or KeyCode = 40 Then Exit Sub 'не реагируем на стреки вниз и вверх
new_list
End Sub
Private Sub ComboBox1_Change()
ComboBox1.DropDown
End Sub
Sub new_list()
prew = ComboBox1.Value
arr = Sheets(1).UsedRange.Columns(1).Value
n = 0
ReDim l_arr(n)
For i = 1 To UBound(arr)
If InStr(1, UCase(arr(i, 1)), UCase(prew)) > 0 Then
ReDim Preserve l_arr(n)
l_arr(n) = arr(i, 1)
n = n + 1
End If
Next
ComboBox1.List = l_ar
End Sub
Во Вложении пример с настолько подробными комментариями, чтобы было понятно мне год назад Спасибо большое Dima S, без него ничего не получилось бы
Sub ComboBox1_Change()
prew = ComboBox1.Text
arr = Sheets(1).UsedRange.Value
n = 0
ReDim l_arr(n)
For i = LBound(arr) To UBound(arr)
If InStr(1, arr(i, 1), prew) > 0 Then
ReDim Preserve l_arr(n)
l_arr(UBound(l_arr)) = arr(i, 1)
n = n + 1
End If
Next
ComboBox1.List = l_arr
End Sub
Dima S, спасибо за ответ, но ничего нового - ComboBox1.Text отслеживает не мой введенный текст, а уже с автозаполнением, соответственно список формируется неправильно (надеюсь есть способ кроме посимвольного перехвата), и самое важное для меня - как после введения первого символа программно открыть список с предлагаемыми (отсортированными нами) значениями. Ручками так: вводим первую букву, щелкаем на стрелочке - открывается список, никуда не нажимаем, просто продолжаем вводить буквы, при этом список не закрывается а значения в списке программно меняются...... как его открыть программно после ввода первого символа, то есть сымитировать щелчок по стрелке
Dima S, большое спасибо за MatchEntry, как-то вообще упустил, в принципе под себя все переделал, работает как надо, только один момент, в вашем приложенном примере тоже проявляется: если поле пустое, то при вводе первый введенный символ удаляется (при чем русские буквы, английские печатаются сразу) дальше можно вводить/удалять, все работает..... именно первый ввод символа в пустом боксе, у меня при GotFocus очищаю поле Value = "" (для моего удобства). Пытался программно вставить символ и удалить его, потом вставить введенный текст, но пока без успехов, в чем причина, как побороть?
Друзья, кто на сайте, помогите, ткните носом, почему, даже примитивно не могу справится
внутри EnableEvents, чтобы не вызвать самого себя, потом их удаляю
Код
SendKeys ("{BACKSPACE}")
SendKeys ("{BACKSPACE}")
или
Код
ComboBox1.Value = ""
осталось решить еще, вдруг - вот только что, возникшую проблему. хочу: ввел часть текста (два-три символа) и из раскрывшегося списка стрелкой выбрать нужное, сейчас пока при нажатии на стрелку вниз заполняется первый в списке элемент и это запускает change - что в свою очередь стирает список, буду дальше колдовать....... ну и кто знает как решить проще момент со стиранием первого символа, подскажите
во-первых открываем список не SendKeys ("%{Down}"), а ComboBox1.DropDown тогда нет проблемы с
Цитата
guzen_pilot написал: если поле пустое, то при вводе первый введенный символ удаляется (при чем русские буквы, английские печатаются сразу)
во-вторых: чтобы была возможность листать список, я его формирую в KeyPress, а не в Change, но тогда опять одна проблема: список не переделывается при нажатии BackSpace. Тогда начал ловить BackSpace в ComboBox1_KeyDown, но опять проблема (список формируется не по введенному тексту, а так: 1. если вводим текст (введенный текст - 1 символ) 2. когда удаляем символ, то по (тексту до удаления (т.е. то что сейчас + символ который уже удалили)), конечно не существенно, но не совсем правильно, я так понимаю виной всему KeyDown.
Нужно: либо делать переформирование списка в change, но запретить если выбираем значение из выпадающего (можно проверить на точное соответствие введенного текста с имеющимися в списке (для меня это цикл, его не хочу), что-то типа Match.... или что-то с отслеживанием BackSpace делать, или еще как. Еще вопрос: мы каждый раз, перед переопределением значений выпадающего списка - определяем массив со списком городов с листа, а если его как глобальный объявить при инициализации ComboBox и выгрузить в конце, так же лучше по идее должно быть?
попробуйте вариант текстбокс+листбокс. как по мне - проще (имеем то что хотим без шаманства).и функциональнее (возможен мультиселект, больше событий за счет двух контролов). можно, поигравшись с видимостью листбокса, сделать совсем похоже на комбобокс)
Друзья, доброго времени суток! Подскажите пожалуйста, а как быть если подобный поиск нужно выполнять в зависимом combobox в котором динамический диапазон? Выдаёт ошибку(