Знаки подстановки для шаблонов в VBA Excel. Знаки подстановки для методов Find и Replace. Знаки подстановки для оператора Like.
Как ни странно, но для метода Find и оператора Like в VBA Excel правила использования знаков подстановки для шаблонов поиска (Find) и сравнения строк (Like) различаются, причем оператор Like имеет некоторые преимущества. Например, знак # при сравнении строк с помощью оператора Like обозначает любую цифру, а при поиске методом Find — только самого себя.
Знаки подстановки для методов Find и Replace
Знаки в шаблоне | Совпадения в строке (диапазоне ячеек) |
---|---|
? | Знак вопроса обозначает любой отдельный символ |
* | Звездочка обозначает любое количество любых символов, в том числе ноль символов |
~ | Тильда ставится перед ?, * и ~, чтобы они обозначали сами себя (например, чтобы тильда в шаблоне обозначала сама себя, записать ее нужно дважды: ~~) |
Знаки подстановки для оператора Like
Знаки в шаблоне | Совпадения в сравниваемой строке |
---|---|
? | Знак вопроса обозначает любой отдельный символ, в том числе любую цифру |
* | Звездочка обозначает любое количество любых символов, в том числе ноль символов |
# | Решетка обозначает любую цифру (0-9) |
[СписокСимволов] | Любой отдельный знак, входящий в СписокСимволов |
[!СписокСимволов] | Любой отдельный знак, не входящий в СписокСимволов |
Знаки ?, *, # и [ (открывающая скобка) обозначают сами себя внутри квадратных скобок, а ] (закрывающая скобка) — вне квадратных скобок. Более подробно о знаках подстановки для оператора Like можно прочитать здесь.
Пример использования шаблона
Поиск в диапазоне ячеек, содержимое которых начинается с цифр (с помощью оператора Like):
Sub Primer() Dim myCell As Range For Each myCell In Range(«A1:A6») If myCell Like «#*» Then myCell.Interior.color = vbGreen End If Next End Sub |
В этом примере шаблон «#*» состоит из решетки «#», которая обозначает одну первую цифру, и звездочки «*», которая обозначает любое количество любых символов, в том числе ноль символов. Если содержимое ячейки соответствует шаблону (начинается с цифры), ячейка окрашивается в зеленый цвет.
Более широкие возможности для работы с шаблонами заложены в регулярных выражениях, представленных объектом RegExp.
Когда вы работаете с большими объемами данных, нельзя представить себе эту деятельность без фильтров. Однозначно, что в Excel разработан очень мощный и удобный инструмент фильтрации, который позволяет выбирать определенные данные из диапазона. А с приходом Excel 2007 добавилась возможность выбирать данные с определенной заливкой. Все это облегчает рабочие будни Excel юзеров и упрощает жизнь. Однако, есть еще один элемент, который пока еще не реализован в стандартных фильтрах Excel, но приятно было бы иметь в арсенале, я говорю о фильтрации с помощью символов подстановки, который мы попытаемся сегодня реализовать с помощью VBA.
Оригинальную статью можно найти на сайте https://yoursumbuddy.com/
В данной статье описан способ создания фильтра на основе формы ListBox на VBA. Фильтр использует оператор Like, для поиска соответствий в заданном диапазоне. К примеру, набрав в фильтре celti, программа вернет мне значение Exceltip, но это не самое главное, так как стандартный фильтр позволяет проводить подобные манипуляции. Гораздо интереснее, что оператор Like позволяет использовать символы подстановки, таким образом введя в текстовое поле значение /*/201? , Excel вернет все даты начиная с 2010 года. Плюс ко всему, данный фильтр позволяет задавать чувствительность к регистру и отбирать уникальные значения.
Внизу показаны принципы работы фильтра на примере списка женских имен с добавлением выбора уникальных значений и чувствительности к регистру. Обратите внимание, щелчок на имени в фильтре позволяет выбирать его в списке.
Ниже отображен макрос, который запускается каждый раз, когда меняется значение в текстовом поле фильтра или происходит щелчок на один из элементов списка в фильтре.
1 |
Sub ResetFilter() ‘звездочка возвращает все значения списка UniqueValuesOnly = Me.chkUnique.Value ‘используется, если Уникальные значения равно ИСТИНА If Not UniqueConstraint Then |
В этом макросе использована возможность элемента Collection хранить только уникальные значения. Если на форме установлена галочка Уникальные, то макрос проверит его прежде, чем поместит в массив ListBox.
Переменная FilterPattern имеет звездочки в начале и конце строки. Это позволяет находить записи внутри таблицы.
В дополнение, массив с женскими именами хранит порядковый номер этого имени, что позволяет запускать другой макрос, который выделяет соответствующую ячейку в таблице при выделении имени в форме.
1 |
Private Sub lstDetail_Change() Sub GoToRow() |
Скорость макроса достаточно приемлема для таблиц с менее чем 10000 строками. Но даже с превышением этого порога, макрос будет работать, главное, чтобы число строк было менее 65536.
Для лучшего понимания прикладываю файл с макросом.
Добрый день.
Подскажите, как в макросе использовать подстановочные символы типа «*» или «?», используемые при обычном поиске? Никак не соображу, а поиск в инете уводит в такие теоретические выкладки, что мозг закипает.
Задача такая: есть книга (заполняется она другим отделом, и повлиять на этот процесс нет возможности), в ней листы по месяцам, и к сожалению в именах листов встречаются лишние пробелы, например «май «, а есть и без «излишеств». Каким образом отсечь такие лишние пробелы?
Код |
---|
Sub General_Work() Dim dLastRow As Long, sLastRow As Long, sSheet As String, Mounth As String, sPath As String, sFileName As String Set dbk = Application.ActiveWorkbook Mounth = Sheets(1).Cells(2, 7) ' ячейка в которой указан необходимый месяц dLastRow = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row sPath = "D:отдел" sFileName = "реестр.xls" Workbooks.Open Filename:=sPath & sFileName, _ ReadOnly:=True Set sbk = Application.ActiveWorkbook sLastRow = Sheets("ВЫП " & Mounth & " ").Cells(Rows.Count, 2).End(xlUp).Row 'работает, нужен подст симв ' sLastRow = Sheets("ВЫП " & Mounth & "*").Cells(Rows.Count, 2).End(xlUp).Row 'не работает MsgBox " Последняя строка: " & sLastRow End Sub |
Оператор Like VBA
Like — это оператор в VBA, и это оператор сравнения, который сравнивает заданную строку в качестве аргумента в наборе строк и соответствует шаблону, если шаблон соответствует, то полученный результат является истинным, а если шаблон не соответствует, то полученный результат ложный, это встроенный оператор в VBA.
Оператор «LIKE» — самый недоиспользуемый оператор, несмотря на прекрасное использование. Я не видел много людей, которые использовали бы этот оператор в полной мере в своем кодировании. Фактически, я один из тех, кто не использует этот оператор достаточно часто. Оператор «VBA LIKE» позволяет нам сопоставить образец строки с полной строкой. Используя оператор VBA LIKE, мы можем сравнить две строки с заданным шаблоном. Мы можем проверить, содержит ли строка подстроку в VBA, или мы также можем проверить, содержит ли строка какой-либо определенный формат. Если шаблон соответствует строке, оператор VBA LIKE возвращает TRUE или FALSE.
При сопоставлении строк нам нужно использовать подстановочные знаки для указанного шаблона. Ниже приведены подстановочные знаки, которые мы используем в операторе VBA LIKE.
- Вопросительный знак (?): Используется для сопоставления любого символа в строке. Например, если у нас есть строка «CAT», а шаблон — «C? T», тогда оператор VBA LIKE возвращает TRUE. Если строка — «CATCH, а шаблоны -« C? T », тогда оператор VBA LIKE возвращает FALSE.
- Звездочка (*): соответствует нулю или большему количеству символов. Например, если строка имеет значение «Хорошо», а шаблон — «G ** d», оператор VBA LIKE возвращает значение ИСТИНА.
- Скобки ([]): соответствует любому одиночному символу, указанному в скобках.
- [Char-Char]: соответствует любому одиночному символу в диапазоне Char-Char.
- [! Chars]: соответствует любому одиночному символу, отсутствующему в списке.
- [! Char-Char]: соответствует любому одиночному символу, не входящему в диапазон Char-Char.
Примеры оператора VBA LIKE
Давайте теперь посмотрим на некоторые примеры оператора LIKE в VBA.
Вы можете скачать этот шаблон VBA Like Excel здесь — Шаблон VBA Like Excel
Пример №1 — С вопросительным знаком
Код:
Sub QuestionMark_Example1 () Dim k As String k = "Good" If k Like "Go? D" Then MsgBox "Yes" Else MsgBox "No" End If End Sub
В приведенном выше коде мы предоставили строку как «Хорошо», а шаблон — «Go? D». Поскольку вопросительный знак может соответствовать одному символу, результат будет отображаться как «Да».
Теперь поменяю строку на «Доброе утро».
Код:
Sub QuestionMark_Example1 () Dim k As String k = "Доброе утро" Если k Like "Go? D" Тогда MsgBox "Yes" Else MsgBox "No" End If End Sub
В этом случае будет показано «Нет», потому что мы добавили в строку еще одно слово, то есть «Утро». Чтобы соответствовать любому количеству символов, нам нужно использовать звездочку.
Пример # 2 — Со звездочкой
Код:
Sub QuestionMark_Example2 () Dim k As String k = "Доброе утро" Если k Like "* Good *" Then MsgBox "Yes" Else MsgBox "No" End If End Sub
В приведенном выше примере я добавил две звездочки до и после символа «* Хорошо *». Это будет соответствовать слову «Хорошо» в строке «Доброе утро» и вернет «Да».
Пример № 3 — Со скобками []
Код:
Sub QuestionMark_Example3 () Dim k As String k = "Доброе утро" Если k Like "* [M] *" Then MsgBox "Yes" Else MsgBox "No" End If End Sub
Приведенный выше код соответствует единственной букве, указанной в скобке «M», и возвращает ответ «Да».
Пример №4 — Со скобками и алфавитами [AZ]
Код:
Sub QuestionMark_Example4 () Dim k As String k = "Доброе утро" Если k Like "* [AD] *" Then MsgBox "Yes" Else MsgBox "No" End If End Sub
Выше я упомянул символы для соответствия от A до D.
Это возвращает «Нет» , потому что нет никаких символов от А до D в строке «Доброе утро» .
Теперь я изменю шаблон на [AH]
Код:
Sub QuestionMark_Example4 () Dim k As String k = "Доброе утро" Если k Like "* [AH] *" Then MsgBox "Yes" Else MsgBox "No" End If End Sub
Это вернет «Да», потому что от A до H у нас есть символ «G» в строке «Доброе утро».
Таким образом, мы можем использовать оператор VBA «LIKE» для сопоставления любой строки из шаблона с символами подстановки.
Подстановка знаков и замена символов |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |