Регулярные выражения vba excel

Обновлено: 07.07.2024

Регулярные выражения предназначены для выполнения сложного поиска или замены в строке. В языке VBA нет встроенной поддержки регулярных выражений, однако можно получить доступ через объект VBScript.RegExp . Создать объект позволяет следующий код:

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

Синтаксис регулярных выражений

После создания объекта нужно задать значения следующим свойствам:

  • Pattern — устанавливает или возвращает шаблон;
  • IgnoreCase — если указано значение True , то поиск не будет зависить от регистра символов, а если False (значение по умолчанию) — то будет:
  • Global — если указано значение True , то будут искаться все совпадения с шаблоном (глобальный поиск), а если False (значение по умолчанию) — то только первое совпадение:
  • MultiLine — если указано значение True , то используется многострочный режим, а если False (значение по умолчанию) — то однострочный. При многострочном режиме производится поиск в строке, состоящей из нескольких подстрок, разделенных символом новой строки ( "\n" ). Символ ^ соответствует привязке к началу каждой подстроки, а символ $ соответствует позиции перед символом перевода строки.

Шаблон может содержать комбинации следующих символов, имеющих специальное значение:

  • \n — перевод строки;
  • \r — возврат каретки;
  • \t — знак табуляции;
  • \v — вертикальная табуляция;
  • \f — перевод формата;
  • \N — восьмеричное значение N . Например, \74 соответствует символу < ;
  • \xN — шестнадцатеричное значение N . Например, \x6a соответствует символу j ;
  • \uxxxx — символ Unicode. Например, \u043a соответствует русской букве к ;
  • \cN — специальное значение N . \cJ — перевод строки, \cM — возврат каретки, \cI — знак табуляции, \cK — вертикальная табуляция, \cL — перевод формата.

Листинг 7.1. Проверка правильности ввода даты

Регулярное выражение не может проверить реальность существования даты. Можно проверить только совпадение с шаблоном. Например, дата 30.02.2012 является допустимой для шаблона, но в реальности не существует. В большинстве случаев проверки на совпадение с шаблоном достаточно, но если необходима проверка реальности существования даты, то следует воспользоваться функциями для работы с датами, которые мы рассмотрим в следующей главе.

Метасимвол "точка" соответствует любому символу, кроме символа перевода строки. Чтобы обозначить любой символ, включая символ перевода строки, следует воспользоваться комбинаций [\s\S] . Пример:

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

  • ^ — привязка к началу строки или подстроки (зависит от значения свойства MultiLine );
  • $ — привязка к концу строки или подстроки (зависит от значения свойства MultiLine ).

Если свойство MultiLine равно значению True , то поиск производится в строке, состоящей из нескольких подстрок, разделенных символом новой строки ( \n ). В этом случае символ ^ соответствует привязке к началу каждой подстроки, а символ $ соответствует позиции перед символом перевода строки (листинг 7.2).

Листинг 7.2. Пример использования многострочного режима

Привязку к началу и концу строки следует использовать, если строка должна полностью соответствовать регулярному выражению. Например, привязку нужно использовать для проверки, содержит ли строка число (листинг 7.3).

Листинг 7.3. Проверка наличия целого числа в строке

Если убрать привязку к началу и концу строки, то любая строка, содержащая хотя бы одну цифру, будет соответствовать шаблону (листинг 7.4).

Листинг 7.4. Отсутствие привязки к началу или концу строки

Можно указать привязку только к началу или только к концу строки (листинг 7.5).

Листинг 7.5. Привязка к началу и концу строки

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

  • [09] — соответствует числу 0 или 9;
  • 5 — соответствует любому числу от 0 до 9;
  • [абв] — соответствует буквам "а", "б" и "в";
  • [а-г] — соответствует буквам "а", "б", "в" и "г";
  • [а-яё] — соответствует любой букве от "а" до "я";
  • [АБВ] — соответствует буквам "А", "Б" и "В";
  • [А-ЯЁ] — соответствует любой букве от "А" до "Я";
  • [а-яА-ЯёЁ] — соответствует любой русской букве в любом регистре;
  • [0-9а-яА-ЯёЁa-zA-Z] — любая цифра и любая буква независимо от регистра и языка.

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

  • [^09] — не цифра 0 или 9;
  • [^0-9] — не цифра от 0 до 9;
  • [^а-яА-ЯёЁa-zA-Z] — не буква.

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

Вместо перечисления символов можно использовать стандартные классы:

  • \d — соответствует любой цифре; эквивалентно 1 ;
  • \D — не цифра; эквивалентно [^0-9] ;
  • \w — соответствует любой латинской букве, цифре или символу подчеркивания; эквивалентно [a-zA-Z0-9_] ;
  • \W — не буква, не цифра и не символ подчеркивания; эквивалентно [^a-zA-Z0-9_] ;
  • \s — любой пробельный символ; эквивалентно [ \t\n\r\f\v] ;
  • \S — не пробельный символ; эквивалентно [^ \t\n\r\f\v] .

Количество вхождений символа в строку задается с помощью квантификаторов:

  • — n вхождений символа в строку. Например, шаблон "^2$" соответствует двум вхождениям любой цифры;
  • — n или более вхождений символа в строку. Например, шаблон "^3$" соответствует двум и более вхождениям любой цифры;
  • — не менее n и не более m вхождений символа в строку. Числа указываются через запятую без пробела. Например, шаблон "^1$" соответствует от двух до четырех вхождениям любой цифры;
  • * — ноль или большее число вхождений символа в строку. Эквивалентно комбинации ;
  • + — одно или большее число вхождений символа в строку. Эквивалентно комбинации ;
  • ? — ни одного или одно вхождение символа в строку. Эквивалентно комбинации .

Все квантификаторы являются "жадными". При поиске соответствия ищется самая длинная подстрока, соответствующая шаблону, и не учитываются более короткие соответствия. Рассмотрим это на примере. Получим содержимое всех тегов <b> , вместе с тегами:

Вместо желаемого результата мы получили полностью строку. Чтобы ограничить "жадность", необходимо после квантификатора указать символ ? (листинг 7.6).

Листинг 7.6. Ограничение жадности квантификаторов

Этот код вывел то, что мы искали. Если необходимо получить содержимое без тегов, то нужный фрагмент внутри шаблона следует разместить внутри круглых скобок (листинг 7.7). В этом случае фрагмент будет доступен через коллекцию Submatches .

Листинг 7.7. Получение значения определенного фрагмента

Круглые скобки часто используются для группировки фрагментов внутри шаблона. В этом случае не требуется, чтобы фрагмент запоминался и был доступен в результатах поиска. Чтобы избежать захвата фрагмента после открывающей круглой скобки следует разместить символы ?: (листинг 7.8).

Листинг 7.8. Ограничение захвата фрагмента

В первом примере мы получили два фрагмента полностью соответствующих шаблону и по четыре субфрагмента, которые соответствуют фрагментам, заключенным в шаблоне в круглые скобки. Три последних субфрагмента являются лишними. Чтобы они не выводились в результатах, мы добавили символы ?: после каждой открывающей круглой скобкой. Теперь результат состоит только из фрагментов, полностью соответствующих регулярному выражению.

Обратите внимание на регулярное выражение в предыдущем примере:

Здесь мы использовали метасимвол | , который позволяет сделать выбор между альтернативными значениями. Выражение n|m соответствует одному из символов: n или m . Пример:

К найденному фрагменту в круглых скобках внутри шаблона можно обратиться с помощью механизма обратных ссылок. Для этого порядковый номер круглых скобок в шаблоне указывается после слеша, например, \1 . Нумерация скобок внутри шаблона начинается с 1 . Для примера получим текст между одинаковыми парными тегами (листинг 7.9).

Листинг 7.9. Обратные ссылки

Внутри круглых скобок могут быть расположены следующие конструкции:

  • (?=. ) — положительный просмотр вперед. Выведем все слова, после которых расположена запятая:
  • (. ) — отрицательный просмотр вперед. Выведем все слова, после которых нет запятой:

Рассмотрим небольшой пример. Предположим, необходимо получить все слова, расположенные после тире, причем перед тире и после слов должны следовать пробельные символы:

Как видно из примера, мы получили только два слова вместо пяти. Первое и последнее слово не попали в результат, т. к. расположены в начале и конце строки. Чтобы эти слова попали в результат, необходимо добавить альтернативный выбор (^|\s) для начала строки и (\s|$) для конца строки. Чтобы найденные выражения внутри круглых скобок не попали в результат, следует добавить символы ?: после открывающей скобки:

Первое и последнее слово успешно попали в результат. Почему же слова "word2" и "word4" не попали? Ведь перед тире есть пробел и после слова есть пробел. Чтобы понять причину, рассмотрим поиск по шагам. Первое слово успешно попадает в результат, т. к. перед тире расположено начало строки и после слова есть пробел. После поиска указатель перемещается, и строка для дальнейшего поиска примет следующий вид:

Обратите внимание на то, что перед фрагментом "-word2" больше нет пробела и тире не расположено вначале строки. Поэтому следующим совпадением будет слово "word3", и указатель снова будет перемещен:

Опять перед фрагментом "-word4" нет пробела и тире не расположено вначале строки. Поэтому следующим совпадением будет слово "word5" и поиск будет завершен. Таким образом, слова "word2" и "word4" не попадают в результат, т. к. пробел до фрагмента уже был использован в предыдущем поиске. Чтобы этого избежать следует воспользоваться положительным просмотром вперед (?=. ) :

В этом примере мы заменили фрагмент (?:\s|$) на (?=\s|$) . Поэтому все слова успешно попали в результат.


Статьи по Visual Basic for Applications (VBA)

Помощь сайту

Yandex-деньги: 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

32 комментария для “VBA Excel. Содержание рубрики”

Здравствуйте! У Вас нет темы по работе с фильтром. Можно проконсультироваться на этот счёт?

Здравствуйте, Сергей!
Задавайте вопрос, постараюсь ответить.

Спасибо, Евгений! Имеется в Excel столбец с включённым автофильтром. Можно ли программно запустить окно фильтра для выбора значений? Т.е. не руками нажимать на иконку фильтра, а заставить окно открываться с помощью макроса. Спасибо за ответ.

Да, это возможно:

Сергей, уточните вопрос: нужно программно нажать кнопки Ok и Отмена или отследить, какая из них была нажата?

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

Пример отслеживания нажатий кнопки «OK» автофильтра. На нажатие кнопки «Отмена» код не реагирует.

myString = Range ( "A1" ) . CurrentRegion . SpecialCells ( xlCellTypeVisible ) . Address myString1 = Range ( "A1" ) . CurrentRegion . SpecialCells ( xlCellTypeVisible ) . Address If Not Intersect ( ActiveCell , Range ( "A1" ) ) Is Nothing Then

Range("A1").CurrentRegion можно заменить на имя таблицы.

Евгений, а формулу в поле B2 оставлять или её можно удалить?

Сергей, событие Worksheet_Calculate() не зависит от команды SendKeys "%" . Ограничение стоит здесь:

If Not Intersect ( ActiveCell , Range ( "A1" ) ) Is Nothing Then

Код в процедуре Worksheet_Calculate() срабатывает только когда активна ячейка Range("A1") . Если заменить в этой строке Range("A1") на диапазон строки заголовков таблицы, тогда код будет срабатывать при любой активной ячейке в заголовке.

В столбце «B» не должно быть пустых ячеек до последней строки таблицы.

Как определить в VBA есть узор в ячейке?

If ActiveCell . Interior . Pattern = xlPatternNone Then

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

Set ws = ThisWorkbook . Sheets ( 1 ) 'можно указать любой лист книги 'устанавливаем защиту на все ячейки рабочего диапазона листа 'снимаем защиту только с пустых ячеек рабочего диапазона листа Set rr = ws . UsedRange . SpecialCells ( xlCellTypeBlanks ) Private Sub Workbook_BeforeClose ( Cancel As Boolean )

Добрый день, Владислав!
Замените строку

Добрый день, Евгений!
ОГРОМНОЕ СПАСИБО. :))

Здравствуйте, помогите, пожалуйста, решить задачу((

Здравствуйте, Рафия!
С разработкой кредитного калькулятора вам помогут только за плату на бирже фриланса.

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

Здравствуйте, Ева! Для перемещения фокуса в ячейку справа код VBA не нужен: используйте для этого клавишу «Tab» или настройте клавишу «Enter» для перехода вправо (Файл >> Параметры >> Дополнительно).

Спасибо за ответ! Да, но это надо делать вручную; речь идёт об автоматическом перемещении курсора.

Если вы хотя бы чуть-чуть знакомы с регулярными выражениями, то рекламировать вам их не нужно. Если же вы не совсем в теме, то регулярные выражения (Regular Expressions = RegExp = "регэкспы" = "регулярки") - это язык, где с помощью специальных символов и правил производится поиск нужных подстрок в тексте, их извлечение или замена на другой текст. Это очень мощный и красивый инструмент, на порядок превосходящий по возможностям все остальные способы работы с текстом.

Я уже подробно и с кучей примеров из жизни описывал, как можно добавить поддержку регулярных выражений в Excel с помощью несложных макросов - если вы ещё не читали эту статью, то крайне рекомендую с ней ознакомиться прежде чем продолжать. Откроете для себя много нового, гарантирую :)

Открытым, тем не менее, остается вопрос - а как добавить возможность использовать регулярные выражения в Power Query? Power Query, конечно, хороша и сама по себе и много чего умеет делать с текстом (резать, клеить, чистить и т.д.), но если бы удалось скрестить это с мощью регулярных выражений - это была бы просто бомба.

Встроенных функций для работы с RegExp'ами в Power Query, к сожалению, нет и официальная справка и техподдержка Microsoft отвечают на этот вопрос отрицательно. Однако, есть способ обойти это ограничение :)

Суть метода

Главная идея проста до безобразия.

В списке встроенных возможностей Power Query есть функция Web.Page. Описание этой функции на оф.сайте справки Microsoft предельно лаконично:

Описание функции Web.Page

В переводе это будет: "Возвращает содержимое документа HTML, разбитого на составные структуры, а также представление полного документа и его текста после удаления тегов." Так себе описание, прямо скажем.

Обычно эта функция используется при импорте данных из веба и автоматически подставляется, например, когда мы выбираем на вкладке Данные команду Из интернета (Data - From web) . Мы даём функции в качестве аргумента веб-страницу, а она возвращает нам её содержимое в виде таблиц, вычистив предварительно все теги.

Что в справке НЕ написано, так это то, что помимо языка разметки HTML функция Web.Page поддерживает скрипты на языке JavaScript, который сейчас повсеместно используется на веб-сайтах в интернете. А JavaScript, в свою очередь, всегда умел работать с регулярными выражениями и имеет встроенные функции для RegExp'ов! Так что для реализации регулярок в Power Query нам нужно будет скормить функции Web.Page в качестве аргумента маленькую программку на JavaScript, которая и сделает за Power Query всю работу.

Как это выглядит на чистом JavaScript

Подробных руководств по работе с регулярными выражениями на JavaScript в интернете - масса (например, раз, два).

Если коротко и упрощенно, то код на JavaScript будет выглядет так:

Код на JavaScript

  • var str = 'Оплата по счетам 123 и 789 за колбасу"; - создаем переменную str и присваиваем ей исходный текст, который будем анализировать.
  • var pattern = /\d+/gi; - создаем регулярное выражение и помещаем его в переменную pattern.
    Выражение начинается знаком слэш (/).
    Само выражение здесь, для примера, это \d+ - обозначает любую последовательности цифр.
    Через дробь после выражения идут дополнительные параметры (модификаторы) поиска - их можно указывать в любом порядке:
    • g - означает глобальный поиск, т.е. после нахождения совпадения нужно не останавливаться, а продолжать поиск до конца текста. Если этот модификатор не задан, то наш скрипт выдаст только первое совпадение (123)
    • i - поиск без учёта регистра букв
    • m - многострочный поиск (применяется, когда исходный текст разбит на несколько строк)

    На выходе этот скрипт выдаст нам в качестве результата все числа, найденные в исходном тексте:

    Краткий курс по JavaScript закончен, всем спасибо. Надеюсь, вы ухватили логику :)

    Осталось перенести эту конструкцию в Power Query.

    Функция поиска и извлечения текста по регулярному выражению в Power Query

    1 . Открываем Excel и создаем новый пустой запрос Power Query на вкладке Данные - Получить данные / Создать запрос - Из других источников - Пустой запрос (Data - Get data / New query - From other sources - Blank query) . Если у вас старая версия Excel 2010-2013 и Power Query у вас не встроена, а была установлена как отдельная надстройка, то всё это будет на вкладке Power Query, а не Данные.

    2 . В открывшемся пустом окне редактора запросов в правой панели сразу вводим имя нашей будущей функции (например, fxRegExpExtract)

    Вводим имя функции

    3 . Идём на вкладку Просмотр - Расширенный редактор (View - Advanced Editor) , стираем весь М-код пустого запроса и вставляем туда код нашей суперфункции:

    М-код функции

    Следите за руками:

    В первой строке мы говорим, что в нашей функции будет три текстовых аргумента: txt - исходный анализируемый текст, regex - шаблон регулярного выражения, delim - символ-разделитель для вывода результатов.

    Далее вызываем функцию Web.Page, формируя у нее в аргументе описанный выше код на JavaScript. В код вклеиваем и подставляем наши аргументы-переменные.

    . нужен, чтобы "провалиться" в нужную нам таблицу с результатами. Дело в том, что функция Web.Page в качестве результата выдает несколько вложенных друг в друга таблиц, повторяющих структуру веб-страницы. Без этого фрагмента М-кода наша функция выдавала бы на выходе это:

    Результат функции Web.Page в оригинале

    . и нам пришлось бы несколько раз щелкать мышью по слову Table , последовательно "проваливаясь" в дочерние вложенные таблицы в столбцах Children:

    Пошаговое проваливание во вложенные таблицы

    Вместо всей этой котовасии мы сразу в коде нашей функции указываем какая вложенная таблица и столбец (Text) нам нужны.

    Вот, собственно, и всё секреты. Осталось нажать на кнопку Готово в окне Расширенного редактора, куда мы вставили наш код, и можно приступать к самому вкусному - пробовать нашу функцию в работе.

    Вот вам пара примеров для затравки.

    Пример 1. Извлекаем номер счета и дату из описания платежа

    Имеем банковскую выписку с описанием (назначением) платежей, где нужно вытащить в отдельные столбцы номера и даты оплаченных счетов:

    Банковская выписка

    Грузим таблицу в Power Query стандартным образом через Данные - Из таблицы / диапазона (Data - From T able/R ange) .

    Затем добавляем вычисляемый столбец с нашей функцией через Добавление столбца - Вызывать настраиваемую функцию (Add Column - Invoke Custom Function) и вводим её аргументы:

    Вызываем нашу функцию

    В качестве регулярного выражения (аргумент regex) используем шаблон:

    . в переводе на человеческий язык означающий:

    числа от 3 до 5 разрядов (номера счетов)

    фрагменты вида "2-разрядное число - точка - 2-разрядное число - точка - 4-разрядное число" , то бишь даты вида ДД.ММ.ГГГГ.

    В качестве символа-разделителя (аргумент delim) вводим точку с запятой.

    После нажатия на ОК наша волшебная функция анализирует все исходные данные по нашему регулярному выражению и формирует нам столбец с найденными номерами и датами счетов:

    Полученный столбец с номерами и датами счетов

    Останется его разделить по точке с запятой с помощью команды Главная - Разделить столбец - По разделителю (Home - Split column - By delimiter) и мы получим то, что хотели:

    Готовый результат

    Пример 2. Извлекаем адреса эл.почты из текста

    Предположим, что у нас в качестве исходных данных есть вот такая таблица:

    Исходные данные

    . откуда нам нужно вытащить встречающиеся там адреса эл.почты (для наглядности я выделил их в тексте красным).

    Как и в прошлом примере, грузим таблицу в Power Query стандартным образом через Данные - Из таблицы / диапазона (Data - From T able/R ange) .

    Затем добавляем вычисляемый столбец с нашей функцией через Добавление столбца - Вызывать настраиваемую функцию (Add Column - Invoke Custom Function) и вводим её аргументы:

    Вызываем функцию fxRegExpExtract

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

    В качестве разделителя (delim) можно ввести точку с запятой и пробел.

    Жмём на ОК и получаем столбец с извлеченными из исходной текстовой "каши" адресами эл.почты:

    Извлеченные email в Power Query

    Как говорится: "нет такой хорошей вещи, которую нельзя было бы сделать ещё лучше". Power Query и сам-то по себе крут, а уж в сочетании с регулярными выражениями даёт нам совершенно нереальную мощь и гибкость в обработке любых текстовых данных. Надеюсь, Microsoft когда-нибудь добавит поддержку RegExp в обновлениях Power Query и Power BI и все описанные выше танцы с бубном останутся в прошлом. Ну, а пока - так.

    Зачастую, при работе с многочисленными выгрузками в MS Excel нам приходится обрабатывать, фильтровать и буквально «вытаскивать» интересующие нас и так необходимые в повседневной работе данные. Степень трудоемкости таких «вытаскиваний» варьируется от «выбрать все желтые и красные строчки, потому что остальные – это не наши» до «посчитать для всех клиентов с ФИО Иванов Иван Иванович, у которых в день было больше трех операций и которые обслуживались в ВСП на территории ГОСБ, сумму их вкладных операций». В соответствии с поставленной перед нами задачей, мы выбираем инструмент для ее решения.

    Если вкладка отсутствует, ее необходимо активировать следующим образом:

    а) С помощью перехода в меню «Файл»-> «Параметры», отрываем окно «Параметры Excel»:


    б) На вкладке «Настроить ленту» нужно выбрать «Все вкладки» и поставить отметку в строке «Разработчик», после чего нажать «ОК»:


    в) Также, во вкладке «Центр управления безопасностью», необходимо перейти в «Параметры центра управления безопасностью»:

    г) В открывшемся окне нужно проверить, включены ли макросы, и нажать «ОК»:


    2. Перейти в «Microsoft Visual Basic for Applications», нажав кнопку «Visual Basic» во вкладке «Разработчик» или же с помощью сочетания клавиш Alt+F11


    3. В открывшемся окне, необходимо последовательно перейти в меню «Инструменты» («Tools») -> «Ссылки» («References»):


    4. В окне «Ссылки» («References») нужно проставить отметку в строке Microsoft VBScript Regular Expressions 5.5, после чего нажать «ОК»:

    5. В окне «Microsoft Visual Basic for Applications» создать новый модуль с помощью команд «Вставка» («Insert») -> «Модуль» («Module»):


    6. В открывшемся редакторе кода, необходимо написать следующую функцию:


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

    Прим.: в случае повторного нахождения в строке подходящей нам подпоследовательности, она будет проигнорирована, а результатом функции будет самая первая подходящая подпоследовательность символов.

    Наконец, процесс подготовки завершен, и мы можем потренироваться в написании регулярных выражений. Но, предварительно, давайте разберемся, как выглядят шаблоны для поиска. Вот самые основные из них:

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

    К примеру, рассмотрим задачу поиска в строке ИНН:*


    Как видим, теперь и 10-значные, и 12-значные ИНН извлекаются корректно. Рассмотрим шаблон более подробно: \b(\d|\d)\b. В начале и в конце шаблона мы видим добавившиеся символы \b – они означают края слова и применяются для того, чтобы вместо ИНН из текста не тянулась часть более длинного ОГРН или еще какой-либо последовательности цифр. Также, мы видим, что уже знакомый нам шаблон \d переместился в скобки и получил альтернативный шаблон \d – это сделано для того, чтобы наряду с 10-значными ИНН, производился поиск и 12-значных.


    В данном случае мы применяем шаблон вида [А-ЯЁ]+\s[А-ЯЁ]+\s[А-ЯЁ]+, который состоит из трех шаблонов [А-ЯЁ]+, соединенных между собой символами \s. Здесь все просто – [А-ЯЁ]+ это любой заглавный символ кириллицы с квантификатором +, то есть встречающийся от одного раза до бесконечности. Это, как раз, и будет либо фамилией, либо именем, либо отчеством клиента. Соединительные символы \s означают пробелы между членами ФИО.

    Подытоживая, хочется отметить, что мы рассмотрели лишь малую часть всех возможностей, которые предоставляют регулярные выражения. Существует огромное множество спецсимволов, правил и квантификаторов, комбинируя которые возможно создавать шаблоны практически под любые подпоследовательности символов. На тему использования регулярных выражений написаны целые книги. Стоит отметить, что не все возможности классических регулярных выражений поддерживаются в VBA, но и этого хватит, чтобы облегчить нашу работу с MS Excel.

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