Содержание
- Wildcard Characters used in String Comparisons
- Поддержка и обратная связь
- Оператор Like
- Синтаксис
- Замечания
- Пример
- См. также
- Поддержка и обратная связь
- Как определить, является ли символ в ячейке числом, буквой или специальным символом с помощью VBA?
- 4 ответа
- VBA Excel «contains» операторы?
- 3 ответа 3
Wildcard Characters used in String Comparisons
Встроенная функция сопоставления шаблонов предоставляет многофункциональный инструмент для создания сравнений строк. В следующей таблице показаны подстановочные знаки, которые можно использовать для оператора Like, а также количество цифр или строк, которым они соответствуют.
Символы в шаблоне | Совпадения в выражении |
---|---|
? | Любой знак |
* | Ноль или более символов |
# | Любая цифра (09) |
[ charlist ] | Любой знак в группе charlist |
[! charlist ] | Любой знак вне группы charlist |
Группа из одного или нескольких символов ( charlist ), заключенная в квадратные скобки ([ ]), может использоваться для сопоставления любого отдельного символа в выражении и может включать практически любые символы в набор символов ANSI , включая цифры. На самом деле специальные символы, открывающие скобку ([), вопросительный знак (?), знак цифры (#) и звездочку (*), можно использовать для сопоставления непосредственно самих себя, только если они заключены в скобки. Закрывающая скобка ( ]) не может использоваться в группе для сопоставления самой себя, но ее можно использовать вне группы в качестве отдельного символа.
Помимо простого списка знаков, заключенных в скобки, группа charlist может задавать диапазон символов, используя дефис (-) для разделения верхней и нижней границ диапазона. Например, при использовании [A-Z] в результатах шаблона в сопоставлении, если положение соответствующего символа в выражении содержит любые буквы в верхнем регистре в диапазоне от A до Z. В скобки можно заключить несколько диапазонов без разделения. Например, [a-zA-Z0-9] соответствует всем буквенно-числовым символам. Также существуют другие важные правила для регулярных выражений:
- Восклицательный знак (!) в начале группы charlist означает, что сопоставление выполняется, если все символы, за исключением содержащихся в charlist, найдены в выражении. Если символ восклицательного знака используется без скобок, он сопоставляется с самим собой.
- Дефис (-) можно использовать для сопоставления с самим собой как в начале (если используется восклицательный знак, то после него), так и в конце группы charlist. В любой другой позиции дефис используется для задания диапазона символов ANSI.
- При указании диапазона символов они должны отображаться в порядке возрастания (A-Z или 0-100). [A-Z] является допустимым шаблоном, а [Z-A] — нет.
- Последовательность знаков [ ] игнорируется и считается строкой с нулевой длиной («»).
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Оператор Like
Используется для сравнения двух строк.
Синтаксис
Результат = Шаблон stringLike
Синтаксис оператора Like состоит из следующих частей:
Part | Описание |
---|---|
result | Обязательный элемент; любая числовая переменная. |
строка | Обязательный элемент; любое строковое выражение. |
pattern | Обязательный элемент; любое строковое выражение, соответствующее соглашениям о сопоставлении шаблонов, описанным в разделе «Замечания». |
Замечания
Если аргумент string соответствует аргументу pattern, значением result будет являться True; если не соответствует — значением result будет являться False. Если string либо pattern имеет значение Null, result также будет иметь значение Null.
Поведение оператора Like зависит от оператора Option Compare. Методом по умолчанию для сравнения строк для каждого модуля является Option Compare Binary.
Метод Option Compare Binary выдает результат сравнения строк на основе порядка сортировки, выводимого из внутреннего двоичного представления знаков. Порядок сортировки определяется кодовой страницей.
В следующем примере показан типичный бинарный порядок сортировки:
Метод Option Compare Text выдает результат сравнения строк на основе порядка сортировки текста без учета регистра букв, определяемого языковым стандартом системы. Сортировка тех же знаков с использованием метода Option Compare Text дает следующий порядок сортировки:
Встроенное сопоставление шаблона предоставляет универсальное средство для сравнения строк. Возможности сопоставления шаблона позволяют использовать подстановочные знаки, списки знаков или диапазоны знаков в любой комбинации, чтобы сопоставить строки. В следующей таблице представлены знаки, разрешенные для использования в аргументе pattern, и объясняется, чему они соответствуют:
Знаки в pattern | Сопоставление в string |
---|---|
? | Любой отдельный знак. |
* | Ноль или больше знаков. |
# | Любая однозначная цифра (0–9). |
[ charlist ] | Любой отдельный знак, представленный в charlist. |
[ !charlist ] | Любой отдельный знак, не представленный в charlist. |
Группа из одного или нескольких символов ( charlist ), заключенная в квадратные скобки ([ ]), может использоваться для сопоставления с любым одним символом в строке и может включать практически любой код символов, включая цифры.
Чтобы получить сопоставление для специальных знаков, а именно для левой квадратной скобки ([), вопросительного знака (?), знака номера (#) и звездочки (*), заключите их в квадратные скобки. Знак правой квадратной скобки (]) не может использоваться в рамках группы для сопоставления самому себе, однако может использоваться за пределами группы как отдельный знак.
С помощью дефиса (—), разделяющего нижнюю и верхнюю границы диапазона, charlist может использоваться для определения диапазона знаков. Например, приводит к совпадению, [A-Z] если соответствующая позиция символов в строке содержит прописные буквы в диапазоне от A до Z. Несколько диапазонов могут включаться в квадратные скобки без использования каких-либо разделителей.
Значение указанного диапазона зависит от порядка расположения знаков, допустимого во время выполнения (определяется оператором Option Compare и языковыми настройками системы, в которой выполняется код). В примере Option Compare Binary диапазон [A-E] соответствует A, B и E. С параметром Сравнение текста соответствует [A-E] A, a, À, à, B, B, E, e. Данный диапазон не определяет сопоставление для Ê или ê, поскольку символы с надстрочными знаками располагаются по порядку сортировки после символов без надстрочных знаков.
Также имеются другие важные правила для сопоставления шаблона:
- Восклицательный знак (!) в начале charlist означает, что выполняется сопоставление, если любой знак, кроме знаков, указанных в charlist, будет найден в аргументе string. При использовании вне квадратных скобок восклицательный знак сопоставляется самому себе.
- Дефис (—) может отображаться в начале (но после восклицательного знака, если он используется) или в конце charlist для сопоставления самому себе. На любой другой позиции дефис используется для указания диапазона знаков.
- При задании диапазона знаков они должны отображаться по возрастающему порядку сортировки (от наименьшего к наибольшему). [A-Z] является допустимым шаблоном, но [Z-A] не является.
- Последовательность [] символов считается строкой нулевой длины («»).
В некоторых языках имеются специальные знаки в алфавите, представляющие два отдельных знака. Например, в нескольких языках используется знак «æ» для представления знаков «a» и «e», когда они отображаются вместе. Оператор Like распознает, что такой отдельный специальный знак и соответствующие два отдельных знака являются эквивалентными.
Когда языки, в которых используются специальные знаки, указываются в языковых настройках системы, отдельный специальный знак в аргументе pattern либо в аргументе string сопоставляется с эквивалентной 2-знаковой последовательностью в другой строке. Аналогичным образом отдельный специальный знак в аргументе pattern, заключенный в квадратные скобки (указанный отдельно, в списке или в диапазоне), сопоставляется с эквивалентной 2-знаковой последовательностью в string.
Пример
В этом примере оператор Like используется для сравнения строки с шаблоном.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Как определить, является ли символ в ячейке числом, буквой или специальным символом с помощью VBA?
Я хочу пройти по столбцу с ячейками, содержащими числа, буквы и другие символы разной длины, и классифицировать во второй строке сортировку «шаблона» этой ячейки.
Цифры должны стать «N», буквы должны стать «L», а остальные символы должны остаться прежними.
Так, например, если A1 содержит «A35p @ 5», то вывод в B1 должен быть «LNNL @ N».
Вот мой код, но он работает только для первого символа. Также для других или специальных символов вывод просто продолжает копировать все, что находится после символа. См. Вывод моего тестового примера в коде Excel и VBA ниже. Что мне здесь не хватает?
4 ответа
Хороший вопрос и вопрос. Я потратил некоторое время, чтобы предложить вам несколько вариантов:
1) Функциональность динамического массива Microsoft 365:
Если у вас есть Microsoft365, вы можете использовать:
Таким образом, процедура VBA будет обрабатывать каждый символ в каждой строке и сравнивать его с помощью оператора Like() :
Хотя оператор Like() выглядит как регулярное выражение, это не совсем то же самое. Однако мы могли бы также использовать объект RegeXp:
Давайте создадим функцию для преобразования текста в новый формат с Sub для запуска цикла. Затем давайте удалим диакритические знаки из букв и используем оператор Switch, чтобы проверить, является ли символ числом, буквой или другим: (Обратите внимание, что если символ не является ни числом, ни буквой, нам не нужно выполнять дополнительную проверку, чтобы посмотрите, не «что-нибудь еще» — потому что это все, что осталось!)
Я настоятельно рекомендую вам установить бесплатную и фантастическую надстройку RubberDuck для VBA.
Как правило, в макросах для Excel следует стараться минимизировать количество ссылок на объект Excel. то есть перенести данные в VBA, обработать их в VBA, а затем вернуть результат в Excel. Для небольшого количества ссылок это, вероятно, не представляет большой проблемы, но по мере увеличения диапазона входных данных медленность доступа к объекту Excel станет очевидной.
Ваш код можно значительно упростить, внеся несколько небольших изменений. Его также можно сделать более читабельным, дав вашей переменной более значимые имена.
Изучите приведенный ниже код, чтобы понять, что я имею в виду под этим.
Источник
VBA Excel «contains» операторы?
Нужно, чтобы при сравнивании двух похожих строчек String.
Например: If «йцуке» содержит/включает «йцу» = true.
В других есть такой метод «contains», а в VBA как?
3 ответа 3
В дополнение к уже опубликованному ответу:
Можно использовать оператор like :
Данный оператор чувствителен к регистру, поэтому если нужно опустить чувствительность, можно использовать один из двух вариантов:
- Option Compare Text
Использовать Lcase либо Ucase , т.е. на вашем примере может выглядеть так:
if Lcase(«йЦуКе») like Lcase(«*ЙцУ*») then .
В VBA для этих целей есть функция InStr. Используется как
где start — необязательный параметр, указывающий начальную позицию для поиска (по умолчанию с первого символа)
string1 — строка, в которой осуществляется поиск
string2 — искомая строка
compare — необязательный параметр, указывающий метод сравнения (бинарное, текстовое или сравнение информации в базах данных (только для Access)). По умолчанию используется бинарное сравнение.
Возвращаемые значения функции:
NULL — если любая из строк NULL ,
0 — если string1 пустая строка либо string2 не найдена, либо start больше длины строки string1 ,
start — если string2 пустая строка,
если строка string2 найдена внутри строки string1 , то возвращает позицию, в которой найдено совпадение.
Повторюсь, но все же. InStr, Like — для строки. Если же массив строк, то используется Filter
Filter ( , [, ] [, ]) — просматривает массив строковых значений и ищет в нем все подстроки, совпадающие с заданной строкой. Эта функция имеет четыре аргумента: — искомая строка; — параметр (boolean значение), который указывает, будут ли возвращаемые строки включать искомую подстроку или, наоборот, возвращаться будут только те строки массива, которые не содержат искомой строки в качестве подстроки; — параметр, определяющий метод сравнения строк.
Источник
В VBA для этих целей есть функция InStr. Используется как
InStr([start,] string1, string2[, compare])
где start
— необязательный параметр, указывающий начальную позицию для поиска (по умолчанию с первого символа)
string1
— строка, в которой осуществляется поиск
string2
— искомая строка
compare
— необязательный параметр, указывающий метод сравнения (бинарное, текстовое или сравнение информации в базах данных (только для Access)). По умолчанию используется бинарное сравнение.
Возвращаемые значения функции:
NULL
— если любая из строк NULL
,
0 — если string1
пустая строка либо string2
не найдена, либо start
больше длины строки string1
,
start
— если string2
пустая строка,
если строка string2
найдена внутри строки string1
, то возвращает позицию, в которой найдено совпадение.
Пример использования
Function contains(string1 As String, string2 As String, Optional start As Integer = 1, _
Optional compare As VbCompareMethod = vbTextCompare) As Boolean
' функция проверки вхождения строки string2 в строку string1 без учёта регистра
' если string2 - пустая строка, то возвращается False
Dim findPosition As Integer
contains = False
findPosition = InStr(start, string1, string2, compare)
If Len(string2) > 0 And findPosition >= start Then contains = True
End Function
Sub test()
Dim str1 As String, str2 As String
Dim start As Integer
str1 = "absqwerty"
str2 = "qwer"
MsgBox contains(str1, str2)
End Sub
Вы пробуете сделать выбор из того, что выбора не имеет. Т.е., если бы Вы проверяли только наличие слова «Форум1», тогда применение Select Case было бы оправданным, например
Visual Basic | ||
|
В Вашем случае Вы ищете три разных выражения, и тогда лучьше использовать что-то другое, как подсказывает, например, Pavel55.
И все-таки желательно применять .Value, vbTextCompare (vbBinaryCompare)
Добавлено через 4 часа 19 минут
Давайте тогда добьем строковую функцию instr() до конца.
Никогда не возникала у меня подобная ситуация, но не так давно участник форума Скрипт посоветовал применить Instr() совместно с функцией, к примеру, Ucase() — тоже строковая фукция. И буквально на следующий день…. Поэтому и Вам передаю его совет. Все-таки лучьше застраховаться и писать в функции следующим образом (или что-то подобное):
Visual Basic | ||
|
Что б понять, прогоните где-то в модуле выражение:
Visual Basic | ||
|
При этом, сами значения mStr и cells(i,1).value изменится только в момент (и на момент) применения ф-ции InStr для сравнения. Но это не панацэя!
Удачи.
На чтение 12 мин. Просмотров 18.2k.
Функция VBA InStr является одной из наиболее часто используемых функций в VBA. Он используется для нахождения текста внутри строки и действительно отлично справляется с работой.
Тем не менее, она часто используется, чтобы помочь извлечь часть строки, и эту задачу она выполняет плохо.
Если вы обнаружили, что извлечение текста в VBA является болезненным процессом, тогда читайте дальше. Эта статья покажет вам более простой и лучший способ, используя три реальных примера!
Содержание
- Краткое руководство к статье
- Краткая справка
- Введение
- Когда VBA InStr, Left, Right и Mid полезны
- Работа со строками различной длины
- Использование функции VBA InStr с Mid
- Функция Split
- Пример 1: Получение части имени файла
- Пример 2: диапазон IP-адресов
- Пример 3. Проверьте правильность имени файла
- Заключение
Краткое руководство к статье
В следующей таблице приведено краткое руководство к тому, что рассматривается в этой статье.
Строка | Тип | Задача | Как |
1234ABC334 | Фиксированный размер | Оставить слева 4 символа | Left(s,4) |
1234ABC334 | Фиксированный размер | Оставить справа 3 символа |
Right(s,3) |
1234ABC334 | Фиксированный размер | Оставить 5, 6, 7 символы | Mid(s,5,3) |
«Иван Петрович Сидоров» |
Переменный размер |
Оставить имя | Split(s,» «)(0) |
«Иван Петрович Сидоров» |
Переменный размер |
Оставить отчество |
Split(s,» «)(1) |
«Иван Петрович Сидоров» |
Переменный размер |
Оставить фамилию |
Split(s,» «)(2) |
«Иван Петрович Сидоров» |
Переменный размер |
Оставить фамилию |
Dim v As Variant v = Split(s, » «) lastname= v(UBound(v)) |
Краткая справка
Чтобы узнать больше об элементах, упомянутых в статье, перейдите по следующим ссылкам:
- Если вы хотите узнать больше о функциях 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 больше нуля, то строка содержит значение, которое мы проверяем.
' Проверьте, содержит ли строка Петрович If InStr("Иван Петрович Сидоров", "Петрович") > 0 Then Debug.Print "Найдено" End If
Извлечение с Left, Right и Mid
Функция Left используется для получения символов слева от строки.
Функция Right используется для получения символов справа от строки.
Функция Mid используется для середины строки. Она такая же, как
Left, за исключением того, что вы даете ему стартовую позицию.
Sub IzvlechTekst() Dim s As String: s = "ABCD-7789.WXYZ" Debug.Print Left(s, 2) ' Печатает AB Debug.Print Left(s, 4) ' Печатает ABCD Debug.Print Right(s, 2) ' Печатает YZ Debug.Print Right(s, 4) ' Печатает WXYZ Debug.Print Mid(s, 1, 2) ' Печатает AB Debug.Print Mid(s, 6, 4) ' Печатает 7789 End Sub
Эти три функции работают нормально, если требуемый текст всегда одинакового размера и в одном и том же месте. Для других сценариев они требуют использования 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, чтобы получить позицию первого пробела. Мы хотим получить все символы до пробела. Мы вычитаем одну из позиции, так как это дает нам позицию последней буквы имени.
Sub PoluchitImya() Dim s As String, lPosition As Long s = "John Henry Smith" ' Печатает John lPosition = InStr(s, " ") - 1 Debug.Print Left(s, lPosition) s = "Lorraine Huggard" ' Печатает Lorraine lPosition = InStr(s, " ") - 1 Debug.Print Left(s, lPosition) End Sub
Давайте посмотрим на первый пример в приведенном выше коде. Первый пробел находится в позиции 5. Мы вычтем 1, что дает нам позицию 4. Это позиция последней буквы John, т.е.
Затем мы даем 4 функции Left, и она возвращает первые четыре символа, например, «John»
Мы можем выполнить ту же задачу в одной строке, передав возвращаемое значение из InStr в функцию Left.
Dim s As String s = "John Henry Smith" ' Печатает John Debug.Print Left(s, InStr(s, " ") - 1)
Использование функции VBA InStr с Right
В этом примере мы получим последнее слово в строке, то есть Smith. Мы можем использовать функцию InStrRev. Это то же самое, что InStr, за исключением того, что поиск выполняется с конца строки.
Важно отметить, что InStrRev дает нам позицию с начала строки. Поэтому нам нужно использовать его немного иначе, чем мы использовали InStr и Left.
Sub PoluchitFamiliyu() Dim s As String: s = "John,Henry,Smith" Dim Position As Long, Length As Long Position = InStrRev(s, ",") Length = Len(s) ' Печатает Smith Debug.Print Right(s, Length - Position) ' Альтернативный метод. Печатает Smith - делает в одну строку Debug.Print Right(s, Len(s) - InStrRev(s, ",")) End Sub
Как работает приведенный выше пример:
- Мы получаем позицию последнего пробела, используя InStrRev: 11
- Мы получаем длину строки: 16.
- Вычитаем позицию из длины: 16-11 = 5
- Мы даем 5 функции Right и возвращаем Smith
Использование функции VBA InStr с Mid
В следующем примере мы получим «Henry» из строки. Слово, которое мы ищем, находится между первым и вторым пробелом.
Мы будем использовать функцию Mid здесь.
Sub PoluchitVtoroeImya() Dim s As String: s = "John Henry Smith" Dim firstChar As Long, secondChar As Long Dim count As Long ' Найти пробел плюс 1. Результат 6 firstChar = InStr(s, " ") + 1 ' Найти 2-й пробел. Результат 11 secondChar = InStr(firstChar, s, " ") ' Получить число символов. Результат 5 count = secondChar - firstChar ' Печатает Henry Debug.Print Mid(s, firstChar, count) End Sub
Как видите, это сложно сделать и требует немного усилий, чтобы выяснить. Нам нужно найти первое место. Тогда нам нужно найти второе место. Затем мы должны вычесть одно из другого, чтобы дать нам количество символов, которые нужно взять.
Если у вас есть строка с большим количеством слов, то это может быть очень сложно. К счастью для нас, гораздо проще было извлечь символы из строки. Это называется функцией Split.
Функция Split
Мы можем использовать функцию Split для выполнения приведенных выше примеров. Функция Split разбивает строку на массив. Тогда мы можем легко получить доступ к каждому элементу.
Давайте попробуем те же три примера еще раз, и на этот раз мы будем использовать Split.
Dim s As String: s = "John Henry Smith" Debug.Print Split(s, " ")(0) ' John Debug.Print Split(s, " ")(1) ' Henry Debug.Print Split(s, " ")(2) ' Smith
Ого! Какая разница с использованием Split. Как это работает:
- Функция Split разбивает строку везде, где есть пробел.
- Каждый элемент помещается в массив, начиная с нуля.
- Используя номер местоположения, мы можем получить доступ к элементу массива.
В следующей таблице показано, как может выглядеть массив после использования Split.
Примечание: первая позиция в массиве равна нулю. Наличие нулевых массивов является стандартным в языках программирования.
0 | 1 | 2 |
John | Henry | Smith |
В приведенном выше коде мы разделяем строку каждый раз, когда ее используем. Мы также можем разделить строку один раз и сохранить ее в переменной массива. Тогда мы можем получить к нему доступ, когда захотим.
Sub SplitName() Dim s As String: s = "John Henry Smith" Dim arr() As String arr = Split(s, " ") Debug.Print arr(0) ' John Debug.Print arr(1) ' Henry Debug.Print arr(2) ' Smith End Sub
Если вы хотите узнать больше о массивах, я написал о них целую статью под названием «Полное руководство по использованию массивов в Excel VBA».
В следующих разделах мы рассмотрим примеры из реальной жизни. Вы увидите преимущество использования Split вместо функции InStr.
Пожалуйста, не стесняйтесь попробовать это сами. Это отличный способ учиться, и вы можете повеселиться, пытаясь понять их (или, может быть, только у меня так!)
Пример 1: Получение части имени файла
Представьте, что мы хотим извлечь числа из следующих имен файлов
«VB_23476_Val.xls»
«VV_987_Val.txt»
«VZZA_12223_Val.doc»
Это похоже на пример, где мы получаем второй элемент. Чтобы получить значения здесь, мы используем подчеркивание (то есть «_»), чтобы разбить строку. Смотрите пример кода ниже:
Sub PoluchitNomer() ' Печатает 23476 Debug.Print Split("VB_23476_Val.xls", "_")(1) ' Печатает 987 Debug.Print Split("VV_987_Val.txt", "_")(1) ' Печатает 12223 Debug.Print Split("ABBZA_12223_Val.doc", "_")(1) End Sub
В реальном мире вы обычно читаете такие строки из разных ячеек. Допустим, эти имена файлов хранятся в ячейках от А1 до А3. Мы немного изменим приведенный выше код:
Sub ChitatNomera() Dim c As Range For Each c In Range("A1:A3") ' Разделите каждый элемент по мере его прочтения Debug.Print Split(c, "_")(1) Next c End Sub
Пример 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» не действителен
Вот как бы я это сделал. Сначала я разбил строку по периодам. Число, которое мы ищем, находится между первым и вторым периодом. Поэтому это второй пункт. Когда мы разделяем строку, она помещается на первую позицию в массиве (помните, что массив начинается с нулевой позиции).
Полученный массив будет выглядеть так:
0 | 1 | 2 | 3 |
BE-ABCDDD-DDS 172 | 31 | 23 | 3 |
Код ниже показывает, как это сделать.
Sub IPAdd() ' Проверьте номер, чтобы проверить разные IP-адреса Dim s1 As String: s1 = "BE-ABCDDD-DDS 172.31.23.3" ' Разбить строку, используя символ точки Dim num As Long num = Split(s1, ".")(1) ' Проверьте правильность номера Debug.Print num >= 16 And num <= 31 End Sub
Пример 3. Проверьте правильность имени файла
В этом последнем примере мы хотим проверить правильность имени файла. Есть три правила.
- Должно заканчиваться на .pdf
- Он должен содержать АА
- Он должен содержать 1234 после А
В следующих таблицах показаны некоторые допустимые и недействительные элементы:
Имя файла | Статус |
AA1234.pdf | Действителен |
AA_ljgslf_1234.pdf | Действителен |
AA1234.pdf1 | Недействительно — не заканчивается на .pdf |
1234 AA.pdf | Недействительно — АА не до 1234 |
12_AA_1234_NM.pdf | Действителен |
Сначала мы сделаем это, используя функции InStr и Right.
Sub IspInstr() Dim f As String: f = "AA_1234_(5).pdf" ' Сначала найдите АА, так как 1234 должен идти после Dim lPos As Long: lPos = InStr(f, "AA") ' Ищите 1234 и убедитесь, что последние четыре символа - .pdf Debug.Print InStr(lPos, f, "1234") > 0 And Right(f, 4) = ".pdf" End Sub
Этот код очень грязный. К счастью для нас, у VBA есть Сравнение с шаблоном. Мы можем проверить шаблон строки без необходимости искать элементы и позиции и т.д. Мы используем оператор Like в VBA для сопоставления с шаблоном. Пример ниже показывает, как это сделать.
Sub IspSravnenie() Dim f As String: f = "AA_1234_(5).pdf" ' Определить шаблон Dim pattern As String: pattern = "*AA*1234*.pdf" ' Проверьте каждый элемент по шаблону Debug.Print f Like pattern ' ИСТИНА End Sub
В приведенном выше примере звездочка в шаблоне относится к любому количеству символов.
Давайте разберем этот паттерн * AA * 1234 * .pdf
*- любая группа символов
AA — точные символы AА
*- любая группа символов
1234 — точные символы 1234
*- любая группа символов
.pdf — точные символы .pdf
Чтобы показать, что это работает правильно, давайте попробуем это на всех именах примеров в таблице.
Sub IspSravnenieTest() ' Создать коллекцию имен файлов Dim coll As New Collection coll.Add "AA1234.pdf" coll.Add "AA_ljgslf_1234.pdf" coll.Add "AA1234.pdf1" coll.Add "1234 AA.pdf" coll.Add "12_AA_1234_NM.pdf" ' Определить шаблон Dim pattern As String: pattern = "*AA*1234*.pdf" ' Проверьте каждый элемент по шаблону Dim f As Variant For Each f In coll Debug.Print f Like pattern Next f End Sub
На выходе:
ИСТИНА
ИСТИНА
ЛОЖЬ
ЛОЖЬ
ИСТИНА
Чтобы узнать больше о сопоставлении с шаблоном и ключевом слове Like, ознакомьтесь с этой публикацией.
Заключение
InStr и InStrRev действительно полезны только для простых задач, таких как проверка наличия текста в строке.
Left, Right и Mid полезны, когда положение текста всегда одинаково.
Функция Split — лучший способ извлечь переменную строку.
При попытке проверить формат строки, которая не является фиксированной по размеру, ключевое слово Like (т.е. Сопоставление с образцом) обычно обеспечивает более простое решение.