Для відповідності шаблонів використовуються регулярні вирази .
Для використання в Excel виконайте наступні дії:
Крок 1 : Додайте посилання VBA до "Регулярні вирази Microsoft VBScript 5.5"
- Виберіть вкладку "Розробник" (у мене немає цієї вкладки, що робити? )
- Виберіть піктограму "Visual Basic" у розділі стрічки "Код"
- У вікні "Microsoft Visual Basic для додатків" виберіть "Інструменти" у верхньому меню.
- Виберіть "Посилання"
- Поставте прапорець біля пункту "Регулярні вирази Microsoft VBScript 5.5", який слід включити до вашої робочої книги.
- Натисніть "ОК"
Крок 2 : Визначте свій шаблон
Основні визначення:
- Дальність.
- Напр.
a-zВідповідає малі літери від a до z
- Наприклад,
0-5відповідає будь-якому числу від 0 до 5
[] Збіжіть точно один із об'єктів всередині цих дужок.
- Напр.
[a]Відповідає букві а
- Наприклад,
[abc]відповідає одній букві, яка може бути a, b або c
- Наприклад,
[a-z]збігається з будь-якою малою літерою алфавіту.
()Групуйте різні матчі для цілей повернення. Дивіться приклади нижче.
{} Множник для повторних копій шаблону, визначених перед ним.
- Наприклад,
[a]{2}збігається з двома послідовними малими літерами a:aa
- Наприклад ,
[a]{1,3}відповідає принаймні , один і до три малої літери a, aa,aaa
+ Збіжіть принаймні один або більше шаблонів, визначених перед ним.
- Наприклад
a+, відповідатимуть послідовні знаки " a," aa, aaaтощо
? Зрівняти нуль або один із шаблонів, визначених перед ним.
- Наприклад, шаблон може бути, а може бути, але він може бути узгоджений лише один раз.
- Напр.
[a-z]?Відповідає порожній рядок або будь-яка маленька літера.
* Зрівняйте нуль або більше шаблону, визначеного перед ним. - Наприклад, Wildcard для візерунка, який може бути або не присутній. - Наприклад, [a-z]*відповідає порожній рядок або рядки з малих літер.
. Відповідає будь-якому символу, крім нового рядка \n
- Напр.
a.Збіг на двох символьних рядках, починаючи з а і закінчуючи чим-небудь, крім\n
| АБО оператор
- Напр.,
a|bОзначає aабо bможе бути зіставлений.
- Наприклад,
red|white|orangeвідповідає точно одному з кольорів.
^ НЕ оператор
- Напр.
[^0-9]Символ не може містити число
- Наприклад,
[^aA]символ не може бути малим aчи великимA
\ Спеціальний персонаж, що слідує за втечею
- Наприклад
\., \\, \(, \?, \$,\^
Шаблони кріплення:
^ Збіг повинен відбуватися на початку рядка
- Наприклад,
^aПерший символ повинен бути малою літероюa
- Наприклад,
^[0-9]Першим символом повинно бути число.
$ Збіг повинен відбуватися в кінці рядка
- Наприклад,
a$останній символ повинен бути з малої літериa
Таблиця преференцій:
Order Name Representation
1 Parentheses ( )
2 Multipliers ? + * {m,n} {m, n}?
3 Sequence & Anchors abc ^ $
4 Alternation |
Заздалегідь скорочені символи:
abr same as meaning
\d [0-9] Any single digit
\D [^0-9] Any single character that's not a digit
\w [a-zA-Z0-9_] Any word character
\W [^a-zA-Z0-9_] Any non-word character
\s [ \r\t\n\f] Any space character
\S [^ \r\t\n\f] Any non-space character
\n [\n] New line
Приклад 1 : Запустити як макрос
У наступному прикладі макрос розглядає значення в комірці, A1щоб побачити, чи є перші 1 або 2 символи цифрами. Якщо так, вони видаляються, а решта рядка відображається. Якщо ні, то з'являється вікно, яке говорить про те, що не знайдено відповідності. Клітинні A1значення 12abcповернуться abc, значення 1abcповернеться abc, значення abc123буде повертати «Not Matched» , тому що цифри не були на початку рядка.
Private Sub simpleRegex()
Dim strPattern As String: strPattern = "^[0-9]{1,2}"
Dim strReplace As String: strReplace = ""
Dim regEx As New RegExp
Dim strInput As String
Dim Myrange As Range
Set Myrange = ActiveSheet.Range("A1")
If strPattern <> "" Then
strInput = Myrange.Value
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.Test(strInput) Then
MsgBox (regEx.Replace(strInput, strReplace))
Else
MsgBox ("Not matched")
End If
End If
End Sub
Приклад 2 : Запустити як внутрішньоклітинну функцію
Цей приклад такий же, як у прикладі 1, але він налаштований на функцію внутрішньої комірки. Для використання змініть код на це:
Function simpleCellRegex(Myrange As Range) As String
Dim regEx As New RegExp
Dim strPattern As String
Dim strInput As String
Dim strReplace As String
Dim strOutput As String
strPattern = "^[0-9]{1,3}"
If strPattern <> "" Then
strInput = Myrange.Value
strReplace = ""
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.test(strInput) Then
simpleCellRegex = regEx.Replace(strInput, strReplace)
Else
simpleCellRegex = "Not matched"
End If
End If
End Function
Помістіть ваші рядки ("12abc") у комірку A1. Введіть цю формулу =simpleCellRegex(A1)в комірку, B1і результат буде "abc".

Приклад 3 : Проведіть цикл через діапазон
Цей приклад такий же, як приклад 1, але проходить цикл через діапазон комірок.
Private Sub simpleRegex()
Dim strPattern As String: strPattern = "^[0-9]{1,2}"
Dim strReplace As String: strReplace = ""
Dim regEx As New RegExp
Dim strInput As String
Dim Myrange As Range
Set Myrange = ActiveSheet.Range("A1:A5")
For Each cell In Myrange
If strPattern <> "" Then
strInput = cell.Value
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.Test(strInput) Then
MsgBox (regEx.Replace(strInput, strReplace))
Else
MsgBox ("Not matched")
End If
End If
Next
End Sub
Приклад 4 : Розщеплення різних моделей
Цей приклад перебирає діапазон ( A1, A2& A3) і шукає рядок, починаючи з трьох цифр, а потім - одного символу альфа, а потім 4 числових цифр. Вихід розбивається на озброєння шаблону на сусідні комірки, використовуючи (). $1являє собою перший візерунок, узгоджений в межах першого набору ().
Private Sub splitUpRegexPattern()
Dim regEx As New RegExp
Dim strPattern As String
Dim strInput As String
Dim Myrange As Range
Set Myrange = ActiveSheet.Range("A1:A3")
For Each C In Myrange
strPattern = "(^[0-9]{3})([a-zA-Z])([0-9]{4})"
If strPattern <> "" Then
strInput = C.Value
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = strPattern
End With
If regEx.test(strInput) Then
C.Offset(0, 1) = regEx.Replace(strInput, "$1")
C.Offset(0, 2) = regEx.Replace(strInput, "$2")
C.Offset(0, 3) = regEx.Replace(strInput, "$3")
Else
C.Offset(0, 1) = "(Not matched)"
End If
End If
Next
End Sub
Результати:

Додаткові приклади візерунка
String Regex Pattern Explanation
a1aaa [a-zA-Z][0-9][a-zA-Z]{3} Single alpha, single digit, three alpha characters
a1aaa [a-zA-Z]?[0-9][a-zA-Z]{3} May or may not have preceding alpha character
a1aaa [a-zA-Z][0-9][a-zA-Z]{0,3} Single alpha, single digit, 0 to 3 alpha characters
a1aaa [a-zA-Z][0-9][a-zA-Z]* Single alpha, single digit, followed by any number of alpha characters
</i8> \<\/[a-zA-Z][0-9]\> Exact non-word character except any single alpha followed by any single digit