Навеяно статьей Выпадающий список с быстрым поиском https://www.planetaexcel.ru/techniques/1/9645/ А если нужно именно такой выпадающий список с функцией поиска, но для заполнения списка, для нескольких строк? (не знаю как правильней сформировать описание, подсказывайте - исправлю)
Сам же и отвечу на этот вопрос. Есть, но сложно и долго. Вот мое решение. За основу взят пример Николая Павлова из урока и подредактирован. Все работает как надо. Но для того чтобы сформировать такой работающий список, нужно подготовить столько Отборов, столько Диспетчеров имен, столько Проверок данных, сколько строк данных у вас имеется (в моем нужно примере 20, но настроено для примера 3). Итого вопрос: как это упростить? Может попросить реализовать в PLEX? Думаю полезно будет многим
нужно подготовить столько Отборов, столько Диспетчеров имен,... в моем нужно примере 20, но настроено для примера 3)
А если две тысячи? Не думаю, что это самый удачный метод Я всегда пользуюсь старым классическим методом с формой Форма с текстбоксом и списком и десятком строк кода намного проще чем 100500 формул
В разных справочниках. Но лично мне примеры помогают больше. Понятней Надо просто понять принцип. Понять что делает каждая строка В другой книге можно просто создать форму с тексбексом и списком Или импортировать по ПКМ в проводнике проекта VBA фал из вложения В коде я сделал пояснения для каждой строки
Скрытый текст
Код
Private Sub TextBox1_Change() ' при изменении текстбокса
Dim LastRow As Long, i As Long, X As Long, Arr()
Me.ListBox1.Clear ' очистить список
Me.ListBox1.AddItem "Ф.И.О" ' заполнение заголовка списка
Me.ListBox1.List(ListBox1.ListCount - 1, 1) = "Должность" ' заполнение заголовка списка
With Sheets("Классика") 'выбрать лист со списком
LastRow = .Cells(Rows.Count, 5).End(xlUp).Row ' количество заполненных строк в 5 колонке
Arr = .Range(.Cells(1, 5), .Cells(LastRow, 6)).Value ' считываем список в массив
End With
With ListBox1 ' выбрать список
For i = 1 To UBound(Arr) ' перебираем элементы массива
' If UCase(Arr(i, 1)) Like UCase(Me.TextBox1) & "*" Then ' поиск по началу слова
If InStr(1, Arr(i, 1), TextBox1.Text, vbTextCompare) > 0 Then ' если в колонке имени есть сочеттание из текстбокса поиск по вхождению без учёта регистра' если
.AddItem "" ' добавляем строку в список
.List(X, 0) = Arr(i, 1) ' заполняем первую колонку списка имя
.List(X, 1) = Arr(i, 2) ' заполняем вторую колонку списка должность
X = X + 1 ' увеличиваем счетчик строк в списке
End If
Next
End With
End Sub
Александр Моторин написал: Но лично мне примеры помогают больше. Понятней
Александр, большое спасибо! На вашем примере сделал две формы для документов. Подскажите, пожалуйста, как и в каком месте кода реализовать, чтобы по нажатию на клавишу esc текстбокс закрывался?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous, я в VBA, к сожалению, не разбираюсь... Ищу готовые макросы и вставляю их. Предложенную вами ссылку я посмотрел ранее, но там идет разговор про кнопку "bt". Я скачал пример и посмотрел - там действительно есть кнопка при нажатии на которую появляется текстбокс и при нажатии на esc он пропадает. В макросе Александра нет кнопок. Я попытался вставить код из примера, но результата не получил. Извините, повторюсь, но в VBA я не разбираюсь...(
и не надо. Создаете сами свою, помещаете её за пределами формы, а свойству кнопки Cancel назначаете свойство True. Для события клика по кнопке пишите: Unload Me. ВСЕ. Там вообще не надо знать VBA - все расписано.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
мучают тут человека чтобы сам разобрался. это конечно правильно) я вот тоже вообще не разбираюсь, в первый раз залез форму редактировать
Олег Новожилов, держи только не совсем понятно, зачем это вам, если даже из нескольких найденных позиций нельзя стрелками выбрать желаемый, а приходится мышкой.. Нельзя это улучшить в коде этого выпадающего поиска?
Армен, спасибо! Пример по вашей ссылке я тоже ранее разбирал и кое что использовал для своих целей. Но там форма не пропадала по нажатию на esc... Как я понял, вы добавили на текстбокс маленькую кнопку и реализовали вариант предложенный выше. Ещё раз спасибо, буду разбираться. Но неужели нет варианта закрывать текстбокс по esc? Без лишних кнопочек? Извините, если вопрос дилетантский.)
Олег Новожилов,как говорили в переадресованной теме, можно эту кнопочку разместить за пределами формы (т.е. раздвинуть переместить кнопку туда и снова задвинуть форму)
Олег Новожилов написал: нет варианта закрывать текстбокс по esc? Без лишних кнопочек?
ну как бы и да и нет...TextBox во-первых не может жить отдельно от формы. Поэтому закрывать надо форму. Но если не использовать кнопку - то решение Вас очень удивит: там будет 100500 строк кода, куча непонятных функций и все в этом духе. Потому что придется отслеживать и мышку, и клавиатуру и активность самой формы и даже Excel. Поэтому лучше все же кнопочка Надежно и элегантно.
Цитата
Олег Новожилов написал: сделал её высоту =0 и её и не видно
не лучший вариант, если потом с этой кнопочкой что-то сделать надо будет. Отыскать её на форме с нулевыми размерами будет не так-то просто...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Юрий М написал: Через КомбоБокс окна свойств очень даже легко найдётся
ага. Особенно, если случайно этот элемент затащили не пойми куда по неведению...Не люблю я такие методы - самому ненароком можно так закинуть(или вообще удалить), что потом фиг поймешь откуда ноги растут.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Юрий М написал: Не видно её, если в свойствах Left указать за пределами формы.
Воистину так. Не ведал... Оно, конечно, как бы правильнее за пределами видимого окна формы, что явно видно при смещении кнопки вправо или вниз. Сие куда удобней при редактировании формы. Я обычно кнопку мышом таскаю. Но интересно.
Александр Моторин написал: Я всегда пользуюсь старым классическим методом с формойФорма с текстбоксом и списком и десятком строк кода намного проще чем 100500 формул
А можно, чтобы при появлении формы в ней были все элементы списка, а уже при поиске оставались нужные?
Уважаемые прошу помощи с формой, брал из примера all_3 часть вроде сделал а при копировании строки из формы вылетает ошибка. На вкладке движение есть кнопка добавить. Нужно чтобы при двойном клике в столбце наименование добавлялась строка из формы только наименование, все остальное на форме вроде работает. Мой файл Склад химии 565_3. Всем за ранее спасибо за помощь.