Vba excel поиск по части слова

Обновлено: 06.07.2024

Метод Find объекта Range предназначен для поиска ячейки и сведений о ней в заданном диапазоне по ее значению, формуле и примечанию. Чаще всего этот метод используется для поиска в таблице ячейки по слову, части слова или фразе, входящей в ее значение.

Синтаксис метода Range.Find

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

Expression – это переменная или выражение, возвращающее объект Range, в котором будет осуществляться поиск.

В скобках перечислены параметры метода, среди них только What является обязательным.

Метод Range.Find возвращает объект Range, представляющий из себя первую ячейку, в которой найдена поисковая фраза (параметр What). Если совпадение не найдено, возвращается значение Nothing.

Если необходимо найти следующие ячейки, содержащие поисковую фразу, используется метод Range.FindNext.

Параметры метода Range.Find

  • xlValues (-4163) – значения;
  • xlComments (-4144) – примечания*;
  • xlNotes (-4144) – примечания*;
  • [xlFormulas (-4123) – формулы]**.
  • xlWhole (1) – полное совпадение;
  • xlPart (2) – частичное совпадение.
  • xlByRows (1) – поиск по строкам;
  • xlByColumns (2) – поиск по столбцам.
  • xlNext (1) – поиск вперед;
  • xlPrevious (2) – поиск назад.
  • False (0) – поиск без учета регистра (по умолчанию);
  • True (1) – поиск с учетом регистра.
  • False (0) – двухбайтовый символ может соответствовать однобайтовому символу;
  • True (1) – двухбайтовый символ должен соответствовать только двухбайтовому символу.

* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments и MsgBox xlNotes .
** Тесты показали неработоспособность метода Range.Find с константой xlFormulas в моей версии VBA Excel.

В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.

VBA Instr

Функция VBA InStr является одной из наиболее часто используемых функций в VBA. Он используется для нахождения текста внутри строки и действительно отлично справляется с работой.

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

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

Краткое руководство к статье

В следующей таблице приведено краткое руководство к тому, что рассматривается в этой статье.

Краткая справка

Чтобы узнать больше об элементах, упомянутых в статье, перейдите по следующим ссылкам:

  • Если вы хотите узнать больше о функциях InStr или InStrRev, пожалуйста, прочитайте Поиск в строке.
  • Если вы хотите узнать больше о функциях Mid, Left или Right, посмотрите раздел Извлечение части строки.
  • Для получения дополнительной информации о функции Split проверьте Строка в массив, используя Split.
  • Оператор Like включен в Сравнение строк с шаблоном

Я использую Debug.Print в моих примерах. Он печатает значения в Immediate Window, которое вы можете просмотреть, нажав Ctrl + G (или выберите View-> Immediate Window)

Введение

В этой статье я собираюсь показать вам лучший способ извлечения символов из строки, чем использование функции VBA InStr с Left, Right или Mid.

Эта статья разбита следующим образом:

  • Раздел 1: Как извлечь из строк фиксированного размера.
  • Раздел 2: Как извлечь из строк переменного размера.
  • Раздел 3: Как извлечь из строки переменного размера, используя функцию Split.
  • Разделы с 4 по 6: некоторые примеры из реальной жизни.

Когда VBA InStr, Left, Right и Mid полезны

Если вы хотите проверить, содержит ли строка значение, InStr подходит для этой работы. Если вы хотите сделать простое извлечение, то отлично подойдут Left, Right и Mid.

Использование InStr для проверки, содержит ли строка текст

В следующем примере мы проверяем, содержит ли ФИО «Петрович». Если возвращаемое значение InStr больше нуля, то строка содержит значение, которое мы проверяем.

Извлечение с Left, Right и Mid

Функция Left используется для получения символов слева от строки.
Функция Right используется для получения символов справа от строки.
Функция Mid используется для середины строки. Она такая же, как
Left, за исключением того, что вы даете ему стартовую позицию.

VBA Left, Right and Mid

Эти три функции работают нормально, если требуемый текст всегда одинакового размера и в одном и том же месте. Для других сценариев они требуют использования InStr, чтобы найти определенную позицию в строке. Это усложняет их использование.

Используйте Left, Right или Mid, когда символы всегда будут в одной и той же позиции.

Работа со строками различной длины

Brooke Hilt
Pamela Jurado
Zack Kinzel
Eddy Wormley
Kaitlyn Rainer
Jacque Trickett
Kandra Stanbery
Margo Hoppes
Berenice Meier
Garrett Hyre

(Если вам нужен случайный список имен, попробуйте этот генератор случайных имен)

Использование функции VBA InStr с Left

Мы используем функцию VBA InStr, чтобы получить позицию первого пробела. Мы хотим получить все символы до пробела. Мы вычитаем одну из позиции, так как это дает нам позицию последней буквы имени.

Давайте посмотрим на первый пример в приведенном выше коде. Первый пробел находится в позиции 5. Мы вычтем 1, что дает нам позицию 4. Это позиция последней буквы John, т.е.

VBA InStr and Left

Затем мы даем 4 функции Left, и она возвращает первые четыре символа, например, «John»

Мы можем выполнить ту же задачу в одной строке, передав возвращаемое значение из InStr в функцию Left.

Использование функции VBA InStr с Right

В этом примере мы получим последнее слово в строке, то есть Smith. Мы можем использовать функцию InStrRev. Это то же самое, что InStr, за исключением того, что поиск выполняется с конца строки.

Важно отметить, что InStrRev дает нам позицию с начала строки. Поэтому нам нужно использовать его немного иначе, чем мы использовали InStr и Left.

Как работает приведенный выше пример:

Использование функции VBA InStr с Mid

В следующем примере мы получим «Henry» из строки. Слово, которое мы ищем, находится между первым и вторым пробелом.

Мы будем использовать функцию Mid здесь.

Как видите, это сложно сделать и требует немного усилий, чтобы выяснить. Нам нужно найти первое место. Тогда нам нужно найти второе место. Затем мы должны вычесть одно из другого, чтобы дать нам количество символов, которые нужно взять.

VBA Instr and Mid

Если у вас есть строка с большим количеством слов, то это может быть очень сложно. К счастью для нас, гораздо проще было извлечь символы из строки. Это называется функцией Split.

Функция Split

Мы можем использовать функцию Split для выполнения приведенных выше примеров. Функция Split разбивает строку на массив. Тогда мы можем легко получить доступ к каждому элементу.

Давайте попробуем те же три примера еще раз, и на этот раз мы будем использовать Split.

Ого! Какая разница с использованием Split. Как это работает:

  1. Функция Split разбивает строку везде, где есть пробел.
  2. Каждый элемент помещается в массив, начиная с нуля.
  3. Используя номер местоположения, мы можем получить доступ к элементу массива.

В следующей таблице показано, как может выглядеть массив после использования Split.

Примечание: первая позиция в массиве равна нулю. Наличие нулевых массивов является стандартным в языках программирования.

012
JohnHenrySmith

В приведенном выше коде мы разделяем строку каждый раз, когда ее используем. Мы также можем разделить строку один раз и сохранить ее в переменной массива. Тогда мы можем получить к нему доступ, когда захотим.

Если вы хотите узнать больше о массивах, я написал о них целую статью под названием «Полное руководство по использованию массивов в Excel VBA».

В следующих разделах мы рассмотрим примеры из реальной жизни. Вы увидите преимущество использования Split вместо функции InStr.

Пожалуйста, не стесняйтесь попробовать это сами. Это отличный способ учиться, и вы можете повеселиться, пытаясь понять их (или, может быть, только у меня так!)

Пример 1: Получение части имени файла

Представьте, что мы хотим извлечь числа из следующих имен файлов

«VB_23476_Val.xls»
«VV_987_Val.txt»
«VZZA_12223_Val.doc»

Это похоже на пример, где мы получаем второй элемент. Чтобы получить значения здесь, мы используем подчеркивание (то есть «_»), чтобы разбить строку. Смотрите пример кода ниже:

В реальном мире вы обычно читаете такие строки из разных ячеек. Допустим, эти имена файлов хранятся в ячейках от А1 до А3. Мы немного изменим приведенный выше код:

Пример 2: диапазон IP-адресов

Пример здесь взят из вопроса на веб-сайте StackOverflow.

У пользователя есть строка с IP-адресом в формате «BE-ABCDDD-DDS 172.16.23.3».

Он хочет, чтобы IP в диапазоне от 172,16 до 172,31 был действительным. Так например:

  • «BE-ABCDDD-DDS 172.16.23.3» действителен
  • «BE-ABCDDD-DDS 172.25.23.3» действителен
  • «BE-ABCDDED-DDS 172.14.23.3» не действителен
  • «BE-ABCDDDZZ-DDS 172.32.23.3» не действителен

Вот как бы я это сделал. Сначала я разбил строку по периодам. Число, которое мы ищем, находится между первым и вторым периодом. Поэтому это второй пункт. Когда мы разделяем строку, она помещается на первую позицию в массиве (помните, что массив начинается с нулевой позиции).

Полученный массив будет выглядеть так:

0123

BE-ABCDDD-DDS 172
31233

Код ниже показывает, как это сделать.

Пример 3. Проверьте правильность имени файла

В этом последнем примере мы хотим проверить правильность имени файла. Есть три правила.

  1. Должно заканчиваться на .pdf
  2. Он должен содержать АА
  3. Он должен содержать 1234 после А

В следующих таблицах показаны некоторые допустимые и недействительные элементы:

Сначала мы сделаем это, используя функции InStr и Right.

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

В приведенном выше примере звездочка в шаблоне относится к любому количеству символов.

Давайте разберем этот паттерн * AA * 1234 * .pdf

Чтобы показать, что это работает правильно, давайте попробуем это на всех именах примеров в таблице.

Чтобы узнать больше о сопоставлении с шаблоном и ключевом слове Like, ознакомьтесь с этой публикацией.

Заключение

InStr и InStrRev действительно полезны только для простых задач, таких как проверка наличия текста в строке.

Left, Right и Mid полезны, когда положение текста всегда одинаково.

При попытке проверить формат строки, которая не является фиксированной по размеру, ключевое слово Like (т.е. Сопоставление с образцом) обычно обеспечивает более простое решение.

Поиск и подсветка результатов в Excel

Макрос запрашивает строку для поиска, после чего ищет введенный текст в первом столбце листа, и подсвечивает результаты поиска.

При запуске макроса появляется диалоговое окно (InputBox), позволяющее задать текст для поиска.

Макрос подсвечивает красным цветом внутри ячейки текст, совпадающий с искомым
(+ выделяет найденное полужирным начертанием)

Перед началом поиска, цвет всех ячеек первого столбца сбрасывается (на черный)

Комментарии

В данной строке автор макроса вводит 6 переменных. Наименование переменными присваиваются в зависимости от фантазии, то есть такое какое захотел автор.
Затем каждой переменной было объявлено ее значение, то есть какой тип данных будет содержать/хранить переменная.
4 последним переменным не было объявлено значение, поэтому для них будет установлено значение по умолчанию - Variant (Любой вид данных (тип по умолчанию, если переменная не определена)).
Я так понял.

Прокомментируйте, пожалуйста, эту строку
Dim ra As Range, cell As Range, res, txt$, v, pos&

Здравствуйте, Татьяна. Код - не очень сложный. Для меня вообще ничего сложного нет.
Можем сделать под заказ. А если надо бесплатно, - обратитесь на форумы по Excel, там помогут.

Здравствуйте! А можно ли например если искать кусочек "воп" то вывести список всех слов с "воп"? или это сложный код?

Валерий, конечно я принимаю заказы.
На сайте ведь есть кнопка «Оформить заказ».

Еще заказы принимаете?

Здравствуйте
Это совсем другой макрос нужен
Можно сделать под заказ (мы берем заказы на сумму от 1000 рублей)

Спасибо!
А не могли бы помочь как на основе(а можно и не на основе) этого кода сделать макрос такой.
Искать значения(слово) из столбца F( в нем искомое слово, строк множество пока не станет пусто) в столбце A(возможно несколько повторений искомого текста) и если находит, то брать значение соответствующей ячейки этой строки в столбце G(строка та же что и искомое слово) и подставлять в соответствующую ячейку B(правее ячейки из A). И зациклить пока все слова из F не будут найдены в A и подставлены значения из G.
Небольшая благодарность не заставит себя ждать :)

Здравствуйте, Влад.
Сделать можно все что угодно, - но только под заказ.
Потому что идей у пользователей много, а у меня свободного времени - намного меньше)

Хорошая задумка, но ещё было бы гибче работа в таком формате.
1. Было бы альтернативное окно, в котором можно ввести список (допустим до 1000 значений, либо без ограничений) для массовой подсветки.

2. Предусмотреть поиск не по частичному совпадению, а полному. Например, в массиве указано отчество ВИКТОРОВИЧ, а ищем ВИКТОР. Следовательно, если ВИКТОР не найден, тогда отчество остается не подсвеченным.

Хотел отблагодарить, но не вижу как. Дайте кошелек пожалуйста.

Вывел в виде кнопок на ленту: поиск по А - сброс, поиск по В - сброс.
Для работы с сем. ядром для сайта - самое то. Спасибо огромное!

Можно и так сделать. Любой каприз за ваши деньги)

Вот было бы супер, если бы окошко не пряталось, и в нем была кнопка "сбросить подсветку"

Сброс подсветки выполняется легко, - достаточно выделить первый столбец, поставить «цвет текста» = автоматически, и отжать кнопку «Ж»

В виде макроса (для первого столбца) это будет выглядеть так:

Класс! Спасибо большое!
Хорошо бы еще макрос, который будет сбрасывать подсветку.

Макрос ищет и подсвечивает искомый текст только в первом столбце
(в диапазоне ячеек с A2 до последней заполненной ячейки в столбце A)
А у вас, возможно, данные в другом столбце расположены.

Скопировал код, вставил, при запуске макроса вылезает окно поиска, но сам поиск не происходит и ничего не подсвечивается. Не пойму в чем проблема.

То что нужно. Спасибо большое!
PS только почему то мою тему на планете эксель удалили.


Кто не знает метод FIND в Excel? Я уверен, что все знают, кто имеет дело с рабочими листами Excel. НАЙТИ или популярную комбинацию клавиш Ctrl + F найдет слово или контент, который вы ищете во всей рабочей таблице, а также во всей рабочей книге. Когда вы говорите, что найти означает, что вы находите в ячейках или диапазонах не так ли? Да, правильный метод поиска является частью ячеек или диапазонов в Excel, а также в VBA.

Аналогично, в VBA Find у нас есть опция под названием FIND function, которая может помочь нам найти искомое значение. В этой статье я познакомлю вас с методологией FIND в VBA.

Формула для поиска функции в Excel VBA

В обычной рабочей таблице Excel мы просто нажимаем сочетание клавиш Ctrl + F, чтобы найти содержимое. Но в VBA нам нужно написать функцию, чтобы найти контент, который мы ищем. Хорошо, тогда давайте посмотрим на синтаксис FIND.


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


Если вы наблюдаете за тем, что есть в обычных Ctrl + F, все также присутствует в синтаксисе VBA Find. Теперь посмотрим, о чем говорит каждое слово в синтаксисе.

Что: просто то, что вы ищете. Здесь нужно упомянуть контент, который мы ищем.

После: после какой ячейки вы хотите искать.

LookIn: где искать то, что вы ищете. Например, формулы, значения или комментарии. Параметры: xlFormulas, xlValues, xlComments.

LookAt: ищите ли вы весь контент или только часть контента. Параметры: xlWhole, xlPart.

SearchOrder: вы ищете в строках или столбцах. xlByRows или xlByColumns.

SearchDirection: вы смотрите на следующую или предыдущую ячейку. xlNext, xlPrevious.

MatchCase: содержимое, которое вы ищете, чувствительно к регистру или нет. Правда или ложь.

MatchByte: это только для двухбайтовых языков. Правда или ложь.

SearchFormat: вы ищете форматирование. Если вы ищете формат, вам нужно использовать метод Application.FindFormat .

Это объяснение синтаксиса метода VBA FIND. Помимо первого параметра все необязательно. В разделе примеров мы увидим, как использовать этот метод FIND в кодировании VBA.

Как использовать функцию поиска VBA Excel?

Мы научимся использовать функцию VBA Find Excel на нескольких примерах.

Вы можете скачать этот шаблон VBA Find Excel здесь - VBA найти шаблон Excel

Функция поиска VBA - пример № 1

Прежде всего позвольте мне объяснить вам простой пример использования свойства FIND и найти контент, который мы ищем. Предположим, ниже приведены данные, которые вы имеете в своем листе Excel.


Шаг 1: Из этого я хочу найти имя Джон, давайте откроем Visual Basic и начнем кодирование.

Код:


Шаг 2: Здесь вы не можете начать слово FIND, потому что FIND является частью свойства RANGE. Итак, во-первых, нам нужно упомянуть, где мы смотрим, т.е. Range.


Шаг 3: Итак, сначала укажите диапазон, в котором мы ищем. В нашем примере наш диапазон от B2 до B11.

Код:


Шаг 4: После упоминания диапазона поставьте точку (.) И введите FIND. Вы должны увидеть свойство НАЙТИ.


Шаг 5: Выберите свойство НАЙТИ и откройте скобку.


Шаг 6: Наш первый аргумент - это то, что мы ищем. Чтобы выделить аргумент, мы можем передать аргумент наподобие What: =, это будет полезно для определения того, на какой параметр мы ссылаемся.

Код:


Шаг 7: Последняя часть после нахождения слова, что мы хотим сделать. Нам нужно выбрать слово, поэтому передайте аргумент как. Выберите

Код:


Шаг 8: Затем запустите этот код, используя клавишу F5 или вручную, как показано на рисунке, чтобы он выбрал первое найденное слово Джонсон, которое содержит слово Джон.

Функция поиска VBA - пример № 2

Теперь я покажу вам, как найти слово комментария, используя метод find. У меня есть данные, и в трех ячейках у меня есть комментарий.

В ячейках с красным флажком есть комментарии. Из этого комментария я хочу найти слово «Без комиссии».


Шаг 1: начните код с упоминания диапазона («D2: D11») и поставьте точку (.) И введите Find

Код:


Шаг 2: В аргументе WHAT введите слово «Без комиссии».

Код:


Шаг 3: Пропустите часть After и выберите часть LookIn. В части LookIn мы ищем это слово в комментариях, поэтому выберите xlComments, а затем передайте аргумент как .Select

Код:


Шаг 4: Теперь запустите этот код, используя клавишу F5 или вручную, как показано на рисунке, чтобы он выбрал ячейку с комментарием «Без комиссии». В ячейке D9 есть упомянутый комментарий.

Если искомое слово не будет найдено в диапазоне, мы предоставили код VBA, который будет возвращать ошибку, подобную этой.


Чтобы показать пользователю, что искомое значение недоступно, нам понадобится приведенный ниже код.


То, что нужно запомнить

  • VBA FIND является частью свойства RANGE, и вам нужно использовать FIND только после выбора диапазона.
  • В FIND первый параметр является обязательным (What), кроме этого все остальное является необязательным.
  • Если вам нужно найти значение после определенной ячейки, вы можете упомянуть ячейку в параметре After синтаксиса Find.

Рекомендуемые статьи

Это было руководство к функции поиска VBA. Здесь мы обсудили VBA Find и как использовать функцию Excel VBA Find вместе с некоторыми практическими примерами и загружаемым шаблоном Excel. Вы также можете просмотреть наши другие предлагаемые статьи -

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