Vba excel поиск в listbox

Обновлено: 05.07.2024

Отображает список значений и позволяет выбирать одно или несколько значений.

Примечания

Если ListBox привязан к источнику данных, ListBox сохраняет выбранное значение в этом источнике данных.

ListBox может отображаться как список, так и как группа элементов управления OptionButton или CheckBox.

Свойство по умолчанию для ListBox — это свойство Value.

Событие по умолчанию для ListBox — событие Click.

В раскрывающийся элемент ListBox невозможно поместить текст.

Стили элемента ListBox

Вы можете выбрать любой из двух стилей представления элемента ListBox. Это выражается свойством ListStyle. Каждый из них реализует собственный способ выбора элементов в списке.

Если стиль 0, каждый элемент находится в отдельной строке; пользователь выбирает элемент, выделяя одну или несколько строк.

Если стиль 1, в начале каждой строки появляется OptionButton или CheckBox. В этом случае для выбора элемента пользователь нажимает кнопку или устанавливает флажок. Флажки отображаются только тогда, когда свойство MultiSelect является True.

События

Имя Описание
Click Возникает, когда пользователь окончательно выбирает значение для управления, которое имеет несколько возможных значений.

Методы

Имя Описание
AddItem Для одного столбца ListBoxметод AddItem добавляет элемент в список. Для многоуровневого ListBox этот метод добавляет строку в список.
Clear Удаляет все записи в списке в ListBox.
RemoveItem Удаляет строку из списка в ListBox.

Свойства

Имя Описание
BackColor Возвращает или задает длинный, который указывает фоновый цвет объекта. Для чтения и записи.
BorderColor Возвращает или задает long, который указывает пограничный цвет объекта. Для чтения и записи.
BorderStyle Возвращает или задает набор integer, который указывает тип границы управления. Для чтения и записи.
BoundColumn Возвращает или задает вариант, определяя источник данных в многоуровневом ListBox. Для чтения и записи.
Column Возвращает или задает вариант, представляющие одно значение, столбец значений или двухмерный массив для загрузки в ListBox. Для чтения и записи.
ColumnCount Возвращает или задает long, представляют число столбцов, отображаемого в поле списка. Для чтения и записи.
ColumnHeads Возвращает или задает boolean, который указывает, отображается ли одна строка заголовков столбцов. Для чтения и записи.
ColumnWidths Возвращает или задает строку, которая указывает ширину каждого столбца в многослойном ListBox. Для чтения и записи.
Enabled Возвращает или задает boolean, который указывает, может ли управление получать фокус и реагировать на события, созданные пользователем. Для чтения и записи.
ForeColor Возвращает или задает длинный, который указывает цвет переднего плана объекта. Для чтения и записи.
IMEMode Возвращает или задает integer, который указывает режим времени работы по умолчанию редактора метода ввода (IME) для управления. Для чтения и записи.
IntegralHeight Возвращает или задает boolean, который указывает, отображает ли ListBox полные строки текста в списке или частичные строки. Для чтения и записи.
Список Возвращает или задает вариант, представляющие указанную запись в ListBox. Для чтения и записи.
ListCount Возвращает длинный, который представляет количество записей списка в области управления. Только для чтения.
ListIndex Возвращает или задает вариант, представляющие выбранный в настоящее время элемент в ListBox. Для чтения и записи.
ListStyle Возвращает или задает набор integer, который указывает визуальное появление списка в ListBox. Для чтения и записи.
Locked Возвращает или задает boolean, который указывает, можно ли изменить управление. Для чтения и записи.
MatchEntry Возвращает или задает набор integer, который указывает, как ListBox выполняет поиск своего списка в качестве типов пользователей. Для чтения и записи.
MouseIcon Возвращает строку, которая представляет полное имя пути настраиваемого значка, назначенного для управления. Только для чтения.
MousePointer Возвращает или задает набор integer, который указывает тип указателя, отображаемого при позиционировании пользователя мыши над определенным объектом. Для чтения и записи.
MultiSelect Возвращает или задает набор integer, который указывает, разрешает ли объект несколько выборов. Для чтения и записи.
Selected Возвращает или задает boolean, который указывает состояние выбора элементов в ListBox. Для чтения и записи.
SpecialEffect Возвращает или задает набор integer, который указывает внешний вид объекта. Для чтения и записи.
Text Возвращает или задает строку, которая указывает текст в ListBox, изменяя выбранную строку в области управления. Для чтения и записи.
TextAlign Возвращает или задает набор integer, который указывает, как текст выравнивается в области управления. Для чтения и записи.
TextColumn Возвращает или задает вариант, который идентифицирует столбец в ListBox для отображения пользователю. Для чтения и записи.
TopIndex Возвращает или задает длинный, представляютельный индекс элемента списка, отображаемого в верхней позиции в списке. Для чтения и записи.
Значение Возвращает или задает вариант, который указывает значение в BoundColumn выбранных в настоящее время строк. Для чтения и записи.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

doober, Спасибо за помощь. В файле примере работает все как должно быть. Перенес в оригинал - та же песня.
Почему не работает если записать в одну процедуру, например вот так:
[vba] [/vba] Автор - Dмитрий
Дата добавления - 07.07.2014 в 14:24

а почему не реализовать поиск прямо в этой форме?
добавляете текстбокс на форму и дописываете эвент

а почему не реализовать поиск прямо в этой форме?
добавляете текстбокс на форму и дописываете эвент

[/vba] Автор - millik
Дата добавления - 07.07.2014 в 15:29 Не поверите, но на этой форме попросту уже нет места. Да и не все там так просто. Я представил лишь 10 часть. Второй формой, гораздо нагляднее, короче, без нее НИКАК. Очень жаль, казалось, вопрос то не сложный, но. Не поверите, но на этой форме попросту уже нет места. Да и не все там так просто. Я представил лишь 10 часть. Второй формой, гораздо нагляднее, короче, без нее НИКАК. Очень жаль, казалось, вопрос то не сложный, но. Dмитрий
Будет оригинал,будет и классная песня. Автор - doober
Дата добавления - 07.07.2014 в 16:37 Вы забыли добавить задержку
В моем примере работает все верно Вы забыли добавить задержку
В моем примере работает все верно doober Всем спасибо. С задержкой работает. Без нее - нет. Каким боком она влияет, непонятно. Может кто-нибудь объяснить. Так все в норме. Тему можем закрывать.
Может дело совсем не в задержке, а в чем то еще. Всем спасибо. С задержкой работает. Без нее - нет. Каким боком она влияет, непонятно. Может кто-нибудь объяснить. Так все в норме. Тему можем закрывать.
Может дело совсем не в задержке, а в чем то еще. Dмитрий Если вы вторую форму переместите вправо,то все будет работать.
Двойной клик в форме 2,она прячется,ваша мышка на первом листбоксе,вы по инерции еще кликаете по первому листбоксу Если вы вторую форму переместите вправо,то все будет работать.
Двойной клик в форме 2,она прячется,ваша мышка на первом листбоксе,вы по инерции еще кликаете по первому листбоксу doober а почему не реализовать поиск прямо в этой форме?
добавляете текстбокс на форму и дописываете эвент

Огромное спасибо! Все никак не мог сделать поиск в своей форме.
Ваш код - самое то для меня!

а почему не реализовать поиск прямо в этой форме?
добавляете текстбокс на форму и дописываете эвент

Огромное спасибо! Все никак не мог сделать поиск в своей форме.
Ваш код - самое то для меня! urlchik

а почему не реализовать поиск прямо в этой форме?
добавляете текстбокс на форму и дописываете эвент

Огромное спасибо! Все никак не мог сделать поиск в своей форме.
Ваш код - самое то для меня! Автор - urlchik
Дата добавления - 12.12.2017 в 17:59

millik, А не подскажите, как реализовать этот поиск с поиском следующего значения? Т.е например: 2 столбца: 1. Город, 2. Рейс автобуса. В Москву идет несколько рейсов. При использовании Вашего поиска на форме находит только первое совпадение "Москва" - рейс 21, Нужно найти второе "Москва" - рейс 122. Можно ли это как-то реализовать? Ну например кнопку добавить "Искать далее" и т.п.

millik, А не подскажите, как реализовать этот поиск с поиском следующего значения? Т.е например: 2 столбца: 1. Город, 2. Рейс автобуса. В Москву идет несколько рейсов. При использовании Вашего поиска на форме находит только первое совпадение "Москва" - рейс 21, Нужно найти второе "Москва" - рейс 122. Можно ли это как-то реализовать? Ну например кнопку добавить "Искать далее" и т.п.

Заранее благодарен! Автор - urlchik
Дата добавления - 14.12.2017 в 18:05


Поиск какого-либо значения в ячейках Excel довольно часто встречающаяся задача при программировании какого-либо макроса. Решить ее можно разными способами. Однако, в разных ситуациях использование того или иного способа может быть не оправданным. В данной статье я рассмотрю 2 наиболее распространенных способа.

Поиск перебором значений

Довольно простой в реализации способ. Например, найти в колонке "A" ячейку, содержащую "123" можно примерно так:

Минусами этого так сказать "классического" способа являются: медленная работа и громоздкость. А плюсом является его гибкость, т.к. таким способом можно реализовать сколь угодно сложные варианты поиска с различными вычислениями и т.п.

Поиск функцией Find

Гораздо быстрее обычного перебора и при этом довольно гибкий. В простейшем случае, чтобы найти в колонке A ячейку, содержащую "123" достаточно такого кода:

Вкратце опишу что делают строчки данного кода:
1-я строка: Выбираем в книге лист "Данные";
2-я строка: Осуществляем поиск значения "123" в колонке "A", результат поиска будет в fcell;
3-я строка: Если удалось найти значение, то fcell будет содержать Range-объект, в противном случае - будет пустой, т.е. Nothing.

Полностью синтаксис оператора поиска выглядит так:

Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

What - Строка с текстом, который ищем или любой другой тип данных Excel

After - Ячейка, после которой начать поиск. Обратите внимание, что это должна быть именно единичная ячейка, а не диапазон. Поиск начинается после этой ячейки, а не с нее. Поиск в этой ячейке произойдет только когда весь диапазон будет просмотрен и поиск начнется с начала диапазона и до этой ячейки включительно.

LookIn - Тип искомых данных. Может принимать одно из значений: xlFormulas (формулы), xlValues (значения), или xlNotes (примечания).

LookAt - Одно из значений: xlWhole (полное совпадение) или xlPart (частичное совпадение).

SearchOrder - Одно из значений: xlByRows (просматривать по строкам) или xlByColumns (просматривать по столбцам)

SearchDirection - Одно из значений: xlNext (поиск вперед) или xlPrevious (поиск назад)

MatchCase - Одно из значений: True (поиск чувствительный к регистру) или False (поиск без учета регистра)

MatchByte - Применяется при использовании мультибайтных кодировок: True (найденный мультибайтный символ должен соответствовать только мультибайтному символу) или False (найденный мультибайтный символ может соответствовать однобайтному символу)

SearchFormat - Используется вместе с FindFormat. Сначала задается значение FindFormat (например, для поиска ячеек с курсивным шрифтом так: Application.FindFormat.Font.Italic = True), а потом при использовании метода Find указываем параметр SearchFormat = True. Если при поиске не нужно учитывать формат ячеек, то нужно указать SearchFormat = False.

Чтобы продолжить поиск, можно использовать FindNext (искать "далее") или FindPrevious (искать "назад").

Примеры поиска функцией Find

Пример 1: Найти в диапазоне "A1:A50" все ячейки с текстом "asd" и поменять их все на "qwe"

Обратите внимание : Когда поиск достигнет конца диапазона, функция продолжит искать с начала диапазона. Таким образом, если значение найденной ячейки не менять, то приведенный выше пример зациклится в бесконечном цикле. Поэтому, чтобы этого избежать (зацикливания), можно сделать следующим образом:

Пример 2: Правильный поиск значения с использованием FindNext, не приводящий к зацикливанию.

В ниже следующем примере используется другой вариант продолжения поиска - с помощью той же функции Find с параметром After. Когда найдена очередная ячейка, следующий поиск будет осуществляться уже после нее. Однако, как и с FindNext, когда будет достигнут конец диапазона, Find продолжит поиск с его начала, поэтому, чтобы не произошло зацикливания, необходимо проверять совпадение с первым результатом поиска.

Пример 3: Продолжение поиска с использованием Find с параметром After.

Следующий пример демонстрирует применение SearchFormat для поиска по формату ячейки. Для указания формата необходимо задать свойство FindFormat.

Пример 4: Найти все ячейки с шрифтом "курсив" и поменять их формат на обычный (не "курсив")

Хочу обратить внимание на то, что в этом примере я не стал использовать "защиту от зацикливания", как в Примерах 2 и 3, т.к. шрифт меняется и после "прохождения" по всем ячейкам, больше не останется ни одной ячейки с курсивом.

Свойство FindFormat можно задавать разными способами, например, так:

Поиск последней заполненной ячейки с помощью Find

Следующий пример - применение функции Find для поиска последней ячейки с заполненными данными. Использованные в Примере 4 SpecialCells находит последнюю ячейку даже если она не содержит ничего, но отформатирована или в ней раньше были данные, но были удалены.

Пример 5: Найти последнюю колонку и столбец, заполненные данными

Для поиска функцией Find по маске (шаблону) можно применять символы:
* - для обозначения любого количества любых символов;
? - для обозначения одного любого символа;

- для обозначения символов *, ? и

. (т.е. чтобы искать в тексте вопросительный знак, нужно написать

?, чтобы искать именно звездочку (*), нужно написать

* и наконец, чтобы найти в тексте тильду, необходимо написать

Поиск в скрытых строках и столбцах

Для поиска в скрытых ячейках нужно учитывать лишь один нюанс: поиск нужно осуществлять в формулах, а не в значениях, т.е. нужно использовать LookIn:=xlFormulas

Поиск даты с помощью Find

Если необходимо найти текущую дату или какую-то другую дату на листе Excel или в диапазоне с помощью Find, необходимо учитывать несколько нюансов:

Приведу несколько примеров поиска даты.

Пример 7: Найти текущую дату на листе независимо от формата отображения даты.

Пример 8: Найти 1 марта 2018 г.

Искать часть даты - сложнее. Например, чтобы найти все ячейки, где месяц "март", недостаточно искать "03" или "3". Не работает с датами так же и поиск по шаблону. Единственный вариант, который я нашел - это выбрать формат в котором месяц прописью для ячеек с датами и искать слово "март" в xlValues.

Тем не менее, можно найти, например, 1 марта независимо от года.

Пример 9: Найти 1 марта любого года.

Книги по теме:






Посмотреть все книги по программированию

Комментарии к статье:

10.09.17 Дмитрий Очень толковая и полезная статья. Помогла мне существенно ускорить мой код. Спасибо!
23.11.17 Гость Спасибо, хорошая статья.
03.12.17 Владимир Спасибо! Использую в своих проектах.
07.12.17 Эд Спасибо, очень пригодилась Ваша статья!
19.01.18 Николай .find не ищет значение в ячейке, если ячейка в скрытой строке.
.match позволяет не беспокоится о том, что на листах с источниками данных строка с искомым значением будет скрыта из-за установленного фильтра.
05.02.18 Владимир Большое спасибо! Очень толково и понятно.
11.03.18 Гость Здравствуйте,
А если мне требуется найти ячейку в определенном столбце с определенным значением, например "строка 1" и если я нахожу такую, то через несколько строк(неизвестно сколько) мне нужно раскрасить следующую ячейку в другом столбце(самую ближайшую) и остановить цикл, и опять по новой искать дальше "строка 1". Можете посоветовать?
26.03.18 Гость Спасибо! Все бы так описывали! Все доступно и понятно))
23.05.18 Аркадий В VBA я новичок. Активно использую интернет для своих вопросов, однако таких информативных, лаконичных и простых в понимании сайтов не много. Огромное спасибо автору! Адрес уже в закладках.
21.07.18 Гость Спасибо! Уже несколько недель искала подобное!
25.07.18 Joann Метод .find (в случае далнейших множественных обращений к этому механизму) разумно вынести в отдельную функцию, как из управляющей процедуры передать в эту функцию ее параметры (обязательный текстовый параметр 'what:=' - передается без проблем, а вот значения ('xlValues', 'xlWhole', . ) для 'LookIn:=', 'LookAt:=', . - приводят к ошибке)?
15.08.18 Марат Спасибо за статью, пополнил свои знания в части метода Find. Простые переборы хороши на небольших диапазонах. А когда нужно обработать сотни тысяч ячеек, Find - хороший инструмент!
28.08.18 Гость Познавательно и подробно. Спасибо за статью.
16.10.18 Гость Хорошая статья. Спасибо
29.10.18 Sega Полезная статейка. Спасибо.
14.11.18 Гость Статья для начинающих, а тонкости поиска по дате нет ни одного примера
02.02.19 Ибрагим Чушь полная, плагиат!
01.03.19 inexsu.wordpress.com Loop While Not c Is Nothing And c.Address <> firstResult
Когда c станет Nothing, c.Address даст ошибку
Решение https://inexsu.wordpress.com/2018/03/05/range-findnext-method/
01.03.19 Администратор Вы правы, такое действительно может произойти, например, если менять значения найденных ячеек. Т.е., например, ищем значения "asd" и меняем их на "qwe". При замене последнего значения, FindNext ничего уже не найдет, вернет Nothing и произойдет ошибка в условии.
Внес изменения в статье. Спасибо вам за подсказку.
07.04.19 Гость Добрый день. есть 2 таблица на разных листах. макрос нашел нужные ячейки с ИНН по 1 условию, затем мне надо чтобы макрос нашел в таблице 2 на листе 2 все названия клиентов с инн по условию 1 из таблицы 1 с листа 1. как тогда использовать find.
07.04.19 Гость Лучше использовать функцию ВПР
21.05.19 Гость Очень подробная статья. Отдельное спасибо за множество примеров.
17.10.19 Михаил Спасибо большое все понятно доступно и очень полезно
31.10.19 Гость Спасибо.
01.11.19 Гость ку
01.11.19 Гость 2 раза
19.11.19 Kamol Отлично.
Поиск с двумя значениями Пример в колонке А="123" и В="456"
25.12.19 Гость Спасибо!
05.03.20 Гость Добрый день!
Спасибо за код автору
Вопрос

Как сделать поиск слова по, но с любым регистром и любым набором символов
Пример: Я ввожу слово через Textbox
В таблице есть слово компьютер, колодец, ком
Нужно, чтобы программа находила по запросу "омпьюте", "пьюте" слово компьютер а по запросу "ком" слова компьютер и ком"

Ранее я рассмотрел методы создания пользовательских форм и основы работы с ними (если вы никогда не работали с пользовательскими формами, рекомендую для начала прочитать указанную заметку). Далее привел целый ряд практически полезных примеров пользовательских диалоговых окон. В настоящей заметке подробнее рассказывается об использовании элемента управления ListBox.[1]


Рис. 1. Установка свойства RowSource на этапе разработки

Элемент управления ListBox довольно гибкий в использовании, но работа с ним может оказаться достаточно сложной. В большинстве случаев методы, описанные здесь, могут применяться и для работы с элементом управления ComboBox.

При работе с элементом управления ListBox следует учитывать, что:

  • Опции списка элемента управления ListBox могут извлекаться из диапазона ячеек (определяемого свойством RowSource) или добавляться с помощью VBA (для этого используется метод Addltem).
  • Элемент управления ListBox может быть применен для выделения одной или нескольких опций. Соответствующее поведение определяется значением свойства MultiSelect.
  • Если элемент управления ListBox не настроен на выделение нескольких опций, то значение элемента управления ListBox может связываться с ячейкой листа с помощью свойства ControlSource.
  • Элемент управления ListBox может отображаться без предварительно выбранной опции (для этого необходимо установить свойство Listlndex равным –1). Но как только пользователь выделит одну из опций списка, отменить выделение будет невозможно. Исключение из этого правила— значение свойства MultiSelect равно True.
  • Элемент управления ListBox может содержать несколько столбцов (что указывается в свойстве ColumnCount) и даже описательные заголовки (для этого используется свойство ColumnHeads).
  • Вертикальный размер элемента управления ListBox, помещенного в пользовательское диалоговое окно, не всегда совпадает с вертикальным размером объекта UserForm на экране.
  • Опции списка элемента управления ListBox могут отображаться в виде флажков, если разрешено выделение нескольких элементов, или в виде переключателей, если поддерживается только единичное выделение. Это поведение определяется значением свойства ListStyle.

Добавление опций в элемент управления ListBox

Перед отображением пользовательского диалогового окна, которое содержит элемент управления ListBox, следует заполнить элемент управления ListBox необходимыми опциями. Элемент управления ListBox заполняется на этапе разработки проекта посредством указания диапазона ячеек, которые содержат необходимые данные. Его также можно заполнить на этапе выполнения, воспользовавшись кодом VBA для добавления всех опций списка.

В двух примерах этого раздела предполагается следующее:

  • используется диалоговое окно UserForm с именем UserForm1;
  • диалоговое окно UserForm1 содержит элемент управления ListBox, который называется ListBox1;
  • рабочая книга содержит лист Лист1, в диапазоне А1:А12 которого определены опции, отображаемые в элементе управления ListBox.

Добавление опций в элемент управления ListBox на этапе разработки

Для добавления опций в элемент управления ListBox на этапе разработки необходимо, чтобы они хранились в диапазоне ячеек рабочей книги. Воспользуйтесь свойством RowSource для указания диапазона, который содержит опции элемента управления ListBox. На рис. 1 показано окно Properties для элемента управления ListBox (см. также файл listbox fill.xlsm) Свойство RowSource установлено равным Лист1!А1: А12. Когда диалоговое окно UserForm отображается на экране, элемент управления ListBox содержит двенадцать опций из этого диапазона. Опции добавляются в элемент управления ListBox на этапе разработки, сразу после того, как диапазон определяется в качестве значения свойства RowSource.

Удостоверьтесь, что в значении свойства RowSource присутствует имя листа. В противном случае элемент управления ListBox будет применять указанный диапазон в активном рабочем листе. Иногда следует идентифицировать диапазон максимально точно, указав даже имя рабочей книги. Лучше всего сначала определить имя для диапазона, а затем включить его в состав разработанного кода. Это гарантирует использование требуемого диапазона, даже если были добавлены или удалены строки, не входящие в диапазон.

Добавление опций в элемент управления ListBox на этапе выполнения

Чтобы добавить опции элемента управления ListBox на этапе выполнения, необходимо:

  • с помощью кода определить значение свойства RowSource, чтобы указать диапазон, хранящий необходимые данные;
  • создать код, использующий метод Addltem для добавления опций в элемент управления ListBox.

Следующая процедура устанавливает значения свойства RowSource элемента управления ListBox перед тем, как отображается диалоговое окно UserForm. В этом случае опции состоят из значений в ячейках диапазона Categories рабочего листа Budget:

UserForml.ListBoxl.RowSource = " Budget!Categories "
UserForml.Show

Если опции элемента управления ListBox не содержатся в диапазоне ячеек листа, то можно создать специальный код VBA для заполнения элемента управления ListBox перед кодом отображения диалогового окна. Следующая процедура заполняет окно списка элемента управления ListBox названиями месяцев года с помощью метода Addltem:

Читайте также: