Автозаполнение для textbox

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

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

Ответить
RomaS
Сообщения: 57
Зарегистрирован: 05 мар 2008, 09:59

Добрый день!
Следующая задача:
Как в текстбоксе формы выполнять автозаполнение (или подстановку вариантов, не знаю как понятней объяснить), в общем, по мере ввода начала слова чтобы предлагались варианты его продолжения, как в ячейках эксель. Нужно заполнять три текстбокса с ФИО, ну фамилия понятно, вряд-ли совпадет, а вот имена и отчества явно не уникальны. А брать их желательно из столбца на листе, если набранного имени еще нет- добавить в этот "справочник"
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

В аттаче пример решения с использованием функций листа MS Excel.
На основании этого кода легко построить класс.
Как показала практика - автоматическое расширение текста в поле ввода
(без специальной клавиши, в данном примере - F2) неудобно оператору.
Вложения
SubstTxt.zip
(16.15 КБ) 46 скачиваний
Андрей Энтелис,
aentelis.livejournal.com
RomaS
Сообщения: 57
Зарегистрирован: 05 мар 2008, 09:59

Большое спасибо! Сейчас буду пробовать, может что и получится ;)
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

Кроме непосредственно текстового поля мне кажется очень удобно и просто использовать ComboBox, который имеет встроенную возможность автоподстановки текста, подобную той, что есть в ячейках Excel под списком. Достаточно добавить сортировку входных данных и раскрытие списка при начале ввода текста. Смотрите мой пример (вложение).
Вложения
autocomplete.zip
(10.36 КБ) 58 скачиваний
На заказ: VBA, Excel mc-black@yandex.ru
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Mc-black, вариант, разумеется, возможный, но моих операторов (да и меня) раздражает подсказка непосредственно в поле ввода.
Кроме того, практика показала, что когда autocomplete промахивается, большинство обученных! ( :( ) операторов вместо того что бы сразу нажать DEL и продолжить ввод, нажимают стрелку вправо или влево и затем стирают по одному символу :( и только потом вводят новый текст.
Опять же предложенная схема хороша когда идёт сопоставление слева для тех же
фамилий (о чём собственно и писал топикстартер), а предложенный мной вариант
легко модифицируется в схему сопоставления "*Text*", удобную при вводе артикулов или номенклатуры названий, c выводом результатов сопоставления в
ComboBox.
Андрей Энтелис,
aentelis.livejournal.com
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

Делайте как вам удобно, я на практике автокомплит еще не применял.
На заказ: VBA, Excel mc-black@yandex.ru
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

это я просто в порядке обсуждения ... ;)
Андрей Энтелис,
aentelis.livejournal.com
RomaS
Сообщения: 57
Зарегистрирован: 05 мар 2008, 09:59

Mc-black, да, такой вариант тоже неплох. убрал стрелку, уменьшил отображение строк до трех... На первый взгляд достаточно удобно
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Для второго варианта (с комбобокс) добавил сохранение нового значения:

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

 Private Sub ComboBox1_AfterUpdate()
Dim i As Long
i = 1
Do While Not ThisWorkbook.Worksheets(1).Cells(i, 1).Value = Empty
    If ThisWorkbook.Worksheets(1).Cells(i, 1).Value <> UserForm1.ComboBox1.Value Then
        i = i + 1
    Else
        Exit Sub
    End If
Loop

If MsgBox("Добавить запись """ & UserForm1.ComboBox1.Value & """ ?", vbYesNo + vbQuestion) = vbYes Then
    ThisWorkbook.Worksheets(1).Cells(i, 1).Value = _
    StrConv(Trim(UserForm1.ComboBox1.Value), vbProperCase)
End If

End Sub 


Сойдет? Или можно как-нибудь получше? :)
Ответить