Страницы: 1
RSS
ComboBox с посимвольным отслеживанием введенного текста
 
Все решил, работает полностью как мне нужно:

Имеем: Список уникальный значений (подойдет для работы с фамилиями) и 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, без него ничего не получилось бы
Изменено: guzen_pilot - 15.05.2016 19:00:49
Помогли? отпишись, а то мы же волнуемся )))
 
Код
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 отслеживает не мой введенный текст, а уже с автозаполнением, соответственно список формируется неправильно (надеюсь есть способ кроме посимвольного перехвата), и самое важное для меня - как после введения первого символа программно открыть список с предлагаемыми (отсортированными нами) значениями. Ручками так: вводим первую букву, щелкаем на стрелочке - открывается список, никуда не нажимаем, просто продолжаем вводить буквы, при этом список не закрывается а значения в списке программно меняются...... как его открыть программно после ввода первого символа, то есть сымитировать щелчок по стрелке  
Помогли? отпишись, а то мы же волнуемся )))
 
Цитата
guzen_pilot написал:
ComboBox1.Text отслеживает не мой введенный текст, а уже с автозаполнением,
ПКМ на комбобоксе в режиме конструктора - свойства MatchEntry - "2 - fm MatchEntryNone"
Чтобы показать список - Alt+стрелка вниз во время набора.

А вообще - такие вещи стандартно делаются с Текстбоксом и Листбоксом - тогда ничего высовывать не надо
Изменено: Dima S - 14.05.2016 02:20:31
 
Dima S, большое спасибо за MatchEntry, как-то вообще упустил, в принципе под себя все переделал, работает как надо, только один момент, в вашем приложенном примере тоже проявляется: если поле пустое, то при вводе первый введенный символ удаляется (при чем русские буквы, английские печатаются сразу) дальше можно вводить/удалять, все работает..... именно первый ввод символа в пустом боксе, у меня при GotFocus очищаю поле Value = "" (для моего удобства). Пытался программно вставить символ и удалить его, потом вставить введенный текст, но пока без успехов, в чем причина, как побороть?

Друзья, кто на сайте, помогите, ткните носом, почему, даже примитивно не могу справится
Изменено: guzen_pilot - 15.05.2016 02:23:42
Помогли? отпишись, а то мы же волнуемся )))
 
могу сказать только что виной этому альт, посланный в SendKeys.
он как будто залипает.
почему - не знаю, нужно искать.
 
решил...... способ некрасивый, но работает: добавляю в код два нажатия (так как процедура отрабатывает любое одно)
Код
    Application.EnableEvents = False
    SendKeys ("{8}")
    SendKeys ("{4}")
    Application.EnableEvents = True

внутри 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 и выгрузить в конце, так же лучше по идее должно быть?

Скидываю, что у меня пока получилось:
Изменено: guzen_pilot - 15.05.2016 16:59:30
Помогли? отпишись, а то мы же волнуемся )))
 
попробуйте вариант текстбокс+листбокс.
как по мне - проще (имеем то что хотим без шаманства).и функциональнее (возможен мультиселект, больше событий за счет двух контролов).
можно, поигравшись с видимостью листбокса, сделать совсем похоже на комбобокс)
 
Dima S, а как сделать тоже самое, только на UserForm, что нужно поменять?
 
смотрите вариант с поиском на форме
 
Народ подскажите, при поиске по форме,
у меня ищет только по буквам с первого слова,
как сделать чтоб искало со второго, третьего и пр...?
Изменено: spartan11 - 08.10.2016 21:23:31 (не прикрепился файл)
 
См. вложение  и кроликов ищет и печеньки... :D
 
Цитата
Logistic написал: См. вложение  и кроликов ищет и печеньки...
спасибо ;)
 
Друзья, доброго времени суток!
Подскажите пожалуйста, а как быть если подобный поиск нужно выполнять в зависимом combobox в котором динамический диапазон?
Выдаёт ошибку(
 
Помогите пожалуйста!
 
Отзовитесь кто-нибудь плиз!
Страницы: 1
Наверх