Vba excel символы подстановки

Знаки подстановки для шаблонов в 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.

96-0-Расширенный фильтр Excel VBA

Когда вы работаете с большими объемами данных, нельзя представить себе эту деятельность без фильтров. Однозначно, что в Excel разработан очень мощный и удобный инструмент фильтрации, который позволяет выбирать определенные данные из диапазона. А с приходом Excel 2007 добавилась возможность выбирать данные с определенной заливкой. Все это облегчает рабочие будни Excel юзеров и упрощает жизнь. Однако, есть еще один элемент, который пока еще не реализован в стандартных фильтрах Excel, но приятно было бы иметь в арсенале, я говорю о фильтрации с помощью символов подстановки, который мы попытаемся сегодня реализовать с помощью VBA.

Оригинальную статью можно найти на сайте https://yoursumbuddy.com/

В данной статье описан способ создания фильтра на основе формы ListBox на VBA. Фильтр использует оператор Like, для поиска соответствий в заданном диапазоне. К примеру, набрав в фильтре celti, программа вернет мне значение Exceltip, но это не самое главное, так как стандартный фильтр позволяет проводить подобные манипуляции. Гораздо интереснее, что оператор Like позволяет использовать символы подстановки, таким образом введя в текстовое поле значение /*/201? , Excel вернет все даты начиная с 2010 года. Плюс ко всему, данный фильтр позволяет задавать чувствительность к регистру и отбирать уникальные значения.

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

96-1-Расширенный фильтр Excel

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

Sub ResetFilter()
Dim rngTableCol As Excel.Range
Dim varTableCol As Variant
Dim RowCount As Long
Dim collUnique As Collection
Dim FilteredRows() As String
Dim i As Long
Dim ArrCount As Long
Dim FilterPattern As String
Dim UniqueValuesOnly As Boolean
Dim UniqueConstraint As Boolean
Dim CaseSensitive As Boolean

‘звездочка возвращает все значения списка
If Not ValidLikePattern(Me.txtFilter.Text) Then
Exit Sub
End If
FilterPattern = «*» & Me.txtFilter.Text & «*»

UniqueValuesOnly = Me.chkUnique.Value
CaseSensitive = Me.chkCaseSensitive

‘используется, если Уникальные значения равно ИСТИНА
Set collUnique = New Collection
Set rngTableCol = loActive.ListColumns(1).DataBodyRange
‘обратите внимание, функция Transpose не работает с больше, чем 65536 строчек
varTableCol = Application.WorksheetFunction.Transpose(rngTableCol.Value)
RowCount = UBound(varTableCol)
ReDim FilteredRows(1 To 2, 1 To RowCount)
For i = 1 To RowCount
If UniqueValuesOnly Then
On Error Resume Next
‘сброс цикла
UniqueConstraint = False
‘не добавляет, если не уникальное значение
collUnique.Add Item:=«test», Key:=CStr(varTableCol(i))
If Err.Number <> 0 Then
UniqueConstraint = True
End If
On Error GoTo 0
End If

If Not UniqueConstraint Then
‘Оператор Like чувствителен к регистру,
‘поэтому необходимо использовать команду Lcase, если галка не стоит
If (Not CaseSensitive And LCase(varTableCol(i)) Like LCase(FilterPattern)) _
Or (CaseSensitive And varTableCol(i) Like FilterPattern) Then
‘добавить в массив, если пункт из ListBox соответствует фильтру
ArrCount = ArrCount + 1
‘в ListBox есть скрытый столбец для нумерования элементов
FilteredRows(1, ArrCount) = i
FilteredRows(2, ArrCount) = varTableCol(i)
End If
End If
Next i
If ArrCount > 0 Then
‘удаляем пустые элементы массива
‘ListBox не может содержать более 65536 элементов
ReDim Preserve FilteredRows(1 To 2, 1 To Application.WorksheetFunction.Max(ArrCount, 65536))
Else
Erase FilteredRows
End If
If ArrCount > 1 Then
Me.lstDetail.List = Application.WorksheetFunction.Transpose(FilteredRows)
Else
Me.lstDetail.Clear
‘добавляем отдельно, если найден только один элемент
If ArrCount = 1 Then
Me.lstDetail.AddItem FilteredRows(1, 1)
Me.lstDetail.List(0, 1) = FilteredRows(2, 1)
End If
End If
End Sub

В этом макросе использована возможность элемента Collection хранить только уникальные значения. Если на форме установлена галочка Уникальные, то макрос проверит его прежде, чем поместит в массив ListBox.

Переменная FilterPattern имеет звездочки в начале и конце строки. Это позволяет находить записи внутри таблицы.

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

1
2
3
4
5
6
7
8
9

Private Sub lstDetail_Change()
GoToRow
End Sub

Sub GoToRow()
If Me.lstDetail.ListCount > 0 Then
Application.Goto loActive.ListRows(Me.lstDetail.Value).Range.Cells(1), True
End If
End Sub

Скорость макроса достаточно приемлема для таблиц с менее чем 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» для сопоставления любой строки из шаблона с символами подстановки.

Подстановка знаков и замена символов

kirillka

Дата: Среда, 09.10.2013, 12:38 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 5


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Добрый день,

С Екселем, а конкретно с VBA я совсем на «Вы».
Поэтому, прошу помощи, сам к сожалению разобраться не смог.

Задача в следующем:
Необходимо, что бы в ячейках колонки B, со значениями (для примера) «64/24/13.2», после включения скрипта
менялись значения на «R64-24-132».
Т.е. шла автоматическая подстановка перед значением символа «R», далее слэш заменялся на «-«, а точка просто удалялась.

Каким образом это можно реализовать?
Заранее спасибо!

 

Ответить

KuklP

Дата: Среда, 09.10.2013, 12:48 |
Сообщение № 2

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

Макросом можно. Но пример за Вас рисовать лениво.
[a1]=»R» & replace(replace([a1],»/»,» — «),».»,»»)


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

Сообщение отредактировал KuklPСреда, 09.10.2013, 12:51

 

Ответить

ShAM

Дата: Среда, 09.10.2013, 15:00 |
Сообщение № 3

Группа: Друзья

Ранг: Старожил

Сообщений: 1347


Репутация:

249

±

Замечаний:
0% ±


Excel 2010

Сергей, тогда уж:
[vba]

Код

[b1]=»R» & replace(replace([b1],»/»,» — «),».»,»»)

[/vba]
Так как:

что бы в ячейках колонки B

:)

Сообщение отредактировал ShAMСреда, 09.10.2013, 15:01

 

Ответить

KuklP

Дата: Среда, 09.10.2013, 15:17 |
Сообщение № 4

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

Ну да. :) Спасибо, Алишер.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

 

Ответить

kirillka

Дата: Среда, 09.10.2013, 16:30 |
Сообщение № 5

Группа: Пользователи

Ранг: Прохожий

Сообщений: 5


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

ShAM, KuklP,
Спасибо за Вашу помощь.

Еще момент, а как мне расширить поле действие макроса, что бы он поменял значения, к примеру в 100 ячейках или до конца документа (где есть значения) колонки B?

 

Ответить

KuklP

Дата: Среда, 09.10.2013, 16:45 |
Сообщение № 6

Группа: Проверенные

Ранг: Старожил

Сообщений: 2369


Репутация:

486

±

Замечаний:
0% ±


2003-2010

Читайте внимательно:

можно. Но пример за Вас рисовать лениво.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728

 

Ответить

ShAM

Дата: Среда, 09.10.2013, 17:11 |
Сообщение № 7

Группа: Друзья

Ранг: Старожил

Сообщений: 1347


Репутация:

249

±

Замечаний:
0% ±


Excel 2010

Еще момент, а как мне расширить поле действие макроса, что бы он поменял значения, к примеру в 100 ячейках или до конца документа (где есть значения) колонки B?

Например, циклом:
[vba]

Код

For i = 1 To Cells(Rows.Count, 2).End(xlUp).Row

[/vba]

 

Ответить

kirillka

Дата: Пятница, 11.10.2013, 14:37 |
Сообщение № 8

Группа: Пользователи

Ранг: Прохожий

Сообщений: 5


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Вновь обращаюсь за советом.

Как мне объединить в один- 2 макроса, представленные в примере (прикрепленный файл)?
Т.е. что бы символы и подстановка «R» работали одновременно.

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

К сообщению приложен файл:

0341841.xls
(38.0 Kb)

 

Ответить

SkyPro

Дата: Пятница, 11.10.2013, 14:41 |
Сообщение № 9

Группа: Друзья

Ранг: Старожил

Сообщений: 1206


Репутация:

255

±

Замечаний:
0% ±


2010

Так?

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

Правда не понял этот моммент. У вас в примере пустые строки встречаются много раз. Вам ножно срабатывание в диапазоне непустых ячеек всего столбца? Или до первой пустой (считая сверху)?


skypro1111@gmail.com

Сообщение отредактировал SkyProПятница, 11.10.2013, 14:47

 

Ответить

kirillka

Дата: Пятница, 11.10.2013, 15:07 |
Сообщение № 10

Группа: Пользователи

Ранг: Прохожий

Сообщений: 5


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

SkyPro,

Желательно до первой пустой.
Ваш вариант, почему-то не работает. Ругается «For without Next».

 

Ответить

SkyPro

Дата: Пятница, 11.10.2013, 16:06 |
Сообщение № 11

Группа: Друзья

Ранг: Старожил

Сообщений: 1206


Репутация:

255

±

Замечаний:
0% ±


2010

Ругается «For without Next».

Угу. Завтыкал проверить.
Вот так нужно?

К сообщению приложен файл:

7511604.xls
(33.5 Kb)


skypro1111@gmail.com

 

Ответить

kirillka

Дата: Пятница, 11.10.2013, 18:35 |
Сообщение № 12

Группа: Пользователи

Ранг: Прохожий

Сообщений: 5


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

SkyPro,

Да, все отлично!
Спасибо Вам огромное за помощь!

 

Ответить

ShAM

Дата: Воскресенье, 19.04.2015, 11:29 |
Сообщение № 13

Группа: Друзья

Ранг: Старожил

Сообщений: 1347


Репутация:

249

±

Замечаний:
0% ±


Excel 2010

AsprOn, здравствуйте. Читайте Правила. Особенно внимательно п.4.

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Vba excel символы переноса строки
  • Vba excel символ строки по номеру
  • Vba excel символ пробела
  • Vba excel символ по номеру в строке
  • Vba excel символ переноса строки в ячейке