Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/120: Рейтинг темы: голосов - 120, средняя оценка - 4.60
10 / 0 / 2
Регистрация: 29.01.2013
Сообщений: 85

Combobox с поиском на VBA

29.01.2013, 10:25. Показов 24340. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Нужна ваша помощь. Недавно начал осваивать VBA по рабочей необходимости возникла задача и столкнулся с проблемой, что не знаю как ее решить.

Задача у меня такая: Есть combobox, элементами списка которого служит список слов на листе Excel. Но список более 500 слов и листать его весь очень неудобно. Поэтому возникла мысль добавить в combobox поиск: Пользователь набирает часть слова и в выпадающем списке видит все слова, которые содержат введенный им с клавиатуры набор символов. При выборе соответствующего слова данное слово записывается в соответствующую ячейку.

У меня получилось что-то типа этого, но работает совсем не так как нужно:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'процедура срабатывает событие нажатия клавиши с клавиатуры
 Dim n As Integer, str1, str2 As String, a As Integer 'str1 - строка в которой ищем; str2 - искомый набор символов; n - количество строк в списке слов
 ComboBox1.Clear 'очищаем комбо-бокс
 Application.ScreenUpdating = False
 ComboBox1.Text = str2 'сохраняем введенное значение в комбо-бокс в переменную
 For n = 2 To 7 'цикл проверки введенных в комбо-бокс значений на наличие в списке слов. Если слово содержит введенные символы - слово добавляется в список значений комбо-бокс
   str1 = Cells(n, 1).Text
   If InStr(1, str1, str2, vbTextCompare) <> 0 Then ComboBox1.AddItem str1
   Next n
 Application.ScreenUpdating = True
 ComboBox1.DropDown 'открываем список найденных значений в комбо-бокс
End Sub
Проблемы которые вылезли:
1. При вводе части текста для поиска автоматически подставляется предлагаемый вариант в текстовое поле комбо-бокса. Мне этого не нужно.
2. Выпадающий список иногда показывается как одно значение и полоса прокрутки. Нужно чтобы выпадающий список был не более 10 значений, а если более появлялся бы скролл.
3. Поиск работает криво.

Подскажите как можно сделать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.01.2013, 10:25
Ответы с готовыми решениями:

Проблемы с поиском в VBA
Здравствуйте,помогите пожалуйста найти ошибку.Как на картинке видно у меня результат поиска вписывает не в тот тексбокс.Подскажите в какой...

Combobox в VBA
Нужно сделать так чтобы после ввода данных вылазило окошко, где было бы 3 варианта ответа и потом один из них вписывался в определенную...

VBA ComboBox
Здравствуйте! Подскажите, возможно ли вообще реализовать, если в Combobox1 я выбираю значение, то Combobox2 выбиралось присвоенное...

10
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
29.01.2013, 10:46
А если взять списки?
Один невидимый. С полным перечнем.
Второй отфильтрованный по введённым в тектбокс буквам на 10 видимых строк + скрол
Клик по списку2 по нужному значению и отрабатывать

Добавлено через 4 минуты
Да даже не в списке а в массиве! зачем считывать по 1 записи?
Считать в массив и перебирать массив с поиском вхождения

Добавлено через 3 минуты
А если уж искать совпадения на листе, то использовать не цикл, а метод Find:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Sub TextBox1_Change()
Dim i As Long, rng As Range, Адрес As String
If k = 0 Then MsgBox "Выберите критерий": Exit Sub
ListBox1.Clear
 
With Range(Cells(2, k), Cells(Cells(Rows.Count, k).End(xlUp).Row, k))
    Set rng = .Find(What:=TextBox1.Value, LookIn:=xlValues, LookAt:=xlPart)
        If Not rng Is Nothing Then
'        MsgBox rng.Address
            Адрес = rng.Address
            Do
                If NAT.Value = False Or UCase(TextBox1.Text) = UCase(Left(rng.Value, Len(TextBox1.Text))) Then
                ListBox1.AddItem Cells(rng.Row, 2)
             ListBox1.AddItem rng.Row
              ListBox1.List(i, 1) = rng.Row
               ListBox1.List(i, 2) = Cells(rng.Row, 2)
                ListBox1.List(i, 3) = Cells(rng.Row, 4)
                  ListBox1.List(i, 4) = Cells(rng.Row, 3)
                i = i + 1
                End If
               Set rng = .FindNext(rng)
            Loop While Адрес <> rng.Address
        End If
End With
 
'If i = 1 Then Cells(ListBox1.List(0, 0), k).Select
 
End Sub
Добавлено через 1 минуту
Только с 13 по 18 строки замените на заполнение своего контрола(списка, комбо)
Список мне нравится больше

Добавлено через 50 секунд
Ну и задайте свой регион поиска в строке 6

Добавлено через 2 минуты
Строки 12, 20 для дополнительной проверки вам тоже могут не понадобиться
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
29.01.2013, 14:08
Цитата Сообщение от Kontugenyi Посмотреть сообщение
1. При вводе части текста для поиска автоматически подставляется предлагаемый вариант в текстовое поле комбо-бокса. Мне этого не нужно.
В свойствах, MatchEntry=2.
Для выделения совпадающих слов можно использовать автофильтр или расширенный фильтр на листе.
Приложите файл со своими наработками.
0
10 / 0 / 2
Регистрация: 29.01.2013
Сообщений: 85
13.02.2013, 00:33  [ТС]
Огромное спасибо, все получилось! TextBox и ListBox мне действительно больше понравились.

Единственная проблема, которая возникла - метод find ищет только по началу строки, а у меня вводимый текст для поиска может быть и в середине строки, поэтому вернулся к перебору.

Правильно ли я понял, что listbox.additem наполняет список listbox, а listbox.list расставляет по порядку? Полазил по описаниям, но так и не понял до конца.

И еще вопрос - есть ли какие альтернативы перебору в данном случае?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub TextBox1_Change()
Dim i As Integer, WholeRange As Range
If TextBox1.Text = "" Then Exit Sub
ListBox1.Clear
i = 0
Set WholeRange = Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1))
For Each cell In WholeRange
If InStr(1, cell.Text, TextBox1.Text, vbTextCompare) <> 0 Then
ListBox1.AddItem cell.Text
ListBox1.List(i, 1) = Cells(WholeRange.Row, 1)
i = i + 1
End If
Next
End Sub
Файлик в приложении.
Вложения
Тип файла: rar Поиск_3.rar (16.5 Кб, 463 просмотров)
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
13.02.2013, 00:49
find ищет только по началу строки
Вот спасибо! Научил! А то я не знамши всё время искал в любом месте!
Буду знать теперь

Добавлено через 4 минуты
В твоём случае 10 строка не нужна. У меня список заполнялся по колонкам

Добавлено через 3 минуты
есть ли какие альтернативы перебору в данном случае
Смотри выше - уже отвечали.
Фильтр будет самый быстрый. Перебор самый медленный. Можно ускорить счиав в массив и обрабатывая массив
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
13.02.2013, 01:30
Помнится GIG_ant делал "Удобный поиск в выпадающем списке" - именно то что нужно, бесплатно, открытый код.
0
10 / 0 / 2
Регистрация: 29.01.2013
Сообщений: 85
13.02.2013, 09:53  [ТС]
Еще раз спасибо! Просто вчера сделал через .find и у меня поиск осуществлялся только по началу слова: если ввожу какие-то символы из середины слова - не ищет. И listbox неправильно работал - после второй буквы была всего одна строчка и скрол... Вечером посмотрю еще раз и приложу то что получилось.. Буду признателен, если покажете где не прав.
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
13.02.2013, 12:43
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub TextBox1_Change()
Dim i As Long, rng As Range, Адрес As String
ListBox1.Clear
With Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1))
    Set rng = .Find(What:=TextBox1.Value, LookIn:=xlValues, LookAt:=xlPart)
        If Not rng Is Nothing Then
            Адрес = rng.Address
            Do
                ListBox1.AddItem rng
               Set rng = .FindNext(rng)
            Loop While Адрес <> rng.Address
        End If
End With
End Sub
0
 Аватар для kalbasiatka
416 / 263 / 83
Регистрация: 27.10.2012
Сообщений: 861
06.05.2013, 00:51
Добрый вечер! Подскажите, как к этому
Кликните здесь для просмотра всего текста
Цитата Сообщение от Alex77755 Посмотреть сообщение
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub TextBox1_Change()
Dim i As Long, rng As Range, Адрес As String
ListBox1.Clear
With Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1))
    Set rng = .Find(What:=TextBox1.Value, LookIn:=xlValues, LookAt:=xlPart)
        If Not rng Is Nothing Then
            Адрес = rng.Address
            Do
                ListBox1.AddItem rng
               Set rng = .FindNext(rng)
            Loop While Адрес <> rng.Address
        End If
End With
End Sub
прикрутить ещё пару колонок listbox'а, чтобы при поиске оставалась вся строка а не только искомая колонка.
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
06.05.2013, 08:02
Если данные записывать в одну колонку, то можно "собрать" нужные колонки в строку:
Visual Basic
1
ListBox1.AddItem rng & " " & Cells(rng.Row, 2) & " " & Cells(rng.Row, 3)
а если по колонкам (в листбоксе установлено ColumnCount>1), то так:
Visual Basic
1
2
3
4
ListBox1.AddItem 
ListBox1.List(ListBox1.ListCount - 1, 0) = Cells(rng.Row, 1)
ListBox1.List(ListBox1.ListCount - 1, 1) = Cells(rng.Row, 2)
ListBox1.List(ListBox1.ListCount - 1, 2) = Cells(rng.Row, 3)
1
 Аватар для kalbasiatka
416 / 263 / 83
Регистрация: 27.10.2012
Сообщений: 861
06.05.2013, 08:35
Большое спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.05.2013, 08:35
Помогаю со студенческими работами здесь

ComboBox в VBA
Есть список в ComboBox: Private Sub UserForm_Initialize() ComboBox1.AddItem &quot;Монитор&quot; ComboBox1.AddItem &quot;ИБП&quot; ...

VBA ComboBox
Добрый день! Вновь я за помощью к более компетентным людям. Подскажите, как можно объединить в ячейке результат выбора ComboBox1 и...

vba ComboBox
как назначить диапазон.

Vba convert textbox to combobox
Скажите, возможно ли изменить textbox на combobox программно?

Работа со словарем combobox vba
Всем привет! Возник такой вопрос. Создал форму в которой есть три чекбокса и три комбобокса. В зависимости от того, какой из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru