Проверка текста по маске

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

Откройте редактор Visual Basic, нажав ALT+F11 или выбрав в меню Сервис - Макрос - Редактор Visual Basic (Tools - Macro - Visual Basic Editor), вставьте новый модуль (меню Insert - Module) и скопируйте туда текст этой функции:

Function MaskCompare(txt As String, mask As String, CaseSensitive As Boolean)
    If Not CaseSensitive Then
        txt = UCase(txt)
        mask = UCase(mask)
    End If
        
    If txt Like mask Then
            MaskCompare = True
        Else
            MaskCompare = False
    End If
End Function

Закройте редактор Visual Basic и вернитесь в Excel.

Теперь через Вставка - Функция (Insert - Function) в категории Определенные пользователем (User Defined) можно найти нашу функцию MaskCompare и воспользоваться ей. Синтаксис функции следующий:

=MaskCompare(txt; mask; CaseSensitive)

где

txt - любой текст или ячейка с текстом, которую мы проверяем на соответствие маске

mask - набор символов, которые ищутся в проверяемом тексте. Набор может содержать спецсимволы подстановки:

  • * - любое количество любых символов
  • ? - один любой символ
  • # - любая цифра (0 - 9)
  • [список_символов] - любой символ из списка
  • [!список_символов] - все символы, кроме содержащихся в списке

Case_Sensitive - необходимо ли учитывать регистр при проверке:

  • 1 - регистр символов учитывается
  • 0 - регистр символов не учитывается

Примеры использования функции

Использование спецсимволов в маске открывает перед пользователем широчайшие возможности. Вот несколько примеров масок:

  • ### - все числа от 0 до 999
  • ????? - все слова из 5 букв
  • м*н - все слова, начинающиеся на "м" и заканчивающиеся на "н"
  • *[аостр]* - все слова, содержащие хотя бы одну из букв а,о,с,т,р
  • *[!abcdefghijklmnopqrstuvwxyz]* - все слова НЕ содержащие английских букв

Ссылки по теме

 


MCH
17.09.2013 21:33:57
Function MaskCompare(ByVal txt As String, ByVal mask As String, Optional CaseSensitive As Boolean = True) As Boolean
    If Not CaseSensitive Then
        txt = UCase(txt)
        mask = UCase(mask)
    End If
    MaskCompare = txt Like mask
End Function
16.01.2014 18:16:06
У меня не получается.
В некой ячейке листа я ввожу эту пользовательскую функцию, задаю аргументы, но результат такой: я вижу слово "ЛОЖЬ".
18.04.2014 15:05:39
аналогично...."ЛОЖЬ"....как пользоваться то? может в условное форматирование надо вставлять?
19.04.2014 09:20:49
Все в порядке. ЛОЖЬ означает, что текст не соответствует маске. Иначе было бы ИСТИНА.
12.12.2014 11:12:59
Николай, Добрый день. Хотел бы спросить по этому макросу. Можно ли сделать так, что в строчку (которая является критерием поиска)
ввести несколько значений например: что бы искал слова, которые могут быть в этом предложении например *идк*(скидка);*кци*(акция);*еди*(кредит), что бы находя хотя бы одно совпадение, формула выдавала бы Истина. Очень нужно (боремся со спамом)
12.12.2014 16:11:35
Павел, тогда функцию надо модернизировать. Первый аргумент будет текстом, а 2-й, 3-й и т.д. - маски для проверки. При совпадении с любой маской будет выдаваться ИСТИНА, иначе ЛОЖЬ.
Function MaskCompareMulti(txt As String, ParamArray masks()) As Boolean
    MaskCompareMulti = False
    For i = LBound(masks) To UBound(masks)
        If txt Like masks(i) Then MaskCompareMulti = True
    Next i
End Function
12.12.2014 16:43:10
Николай, а как будет выглядеть полностью весь макрос (с модернизацией)?
То есть в ячейке первое слово не будет играть ни какой роли?
и как правильно прописывать части слов что бы макрос мог найти с ним совпадение через ; и или
12.12.2014 20:01:47
Дак я ж вам и написал модернизированный вариант в предыдущем комменте.
Используете так:
=MaskCompartMulti(A1;"*идк*";"*кци*";"*еди*")
где А1 - ячейка с проверяемым текстом, а потом идут маски поиска в любом количестве через точку с запятой.
Работает по принципу ИЛИ.
29.07.2016 19:26:04
Николай,

Я к сожалению пока не нашел на форуме тут, как это можно реализовать, но у меня вопрос. А можно ли эту формулу заставить просматривать сразу массив данных и выводить количество совпадений по маске. Например есть много строчек с очень разнообразным текстом (более 100 - новости) и я хочу понять в скольких из них встречается слова например "компания" и "запустила". С возможностью соответственно маску менять.

Если вдруг эта тема уже где-то рассматривалась - направьте пожалуйста.

Заранее благодарен.
06.10.2015 11:57:26
Как сделать поле TXT массивом. Т.е. проверяем не в одной ячейке, а в массиве?
18.05.2017 05:58:52
Добрый день
очень хорошая функция, для своей задачи соединил ее с fuzzylookup, т.е. сначала идет по маске, потом ищет ближайшее похожее, спасибо огромное, выручили в который раз.
10.11.2020 16:25:17
MaskCompare(12, "###", True) выдает ложь. Как правильно вводить txt и mask, чтобы получить ### - все числа от 0 до 999?
31.01.2023 12:06:58
А как сделать чтоб он искал (любая буква).(любая буква). такую маску?
Наверх