Макросы в Excel VBA Регулярные выражения .Execute

.Execute

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

'Ищем все совпадения по регулярному выражению
'Возвращаемое значение - коллекция объектов
Public Function RegExpFind(str As String, _
        Pattern As String, _
        Optional Globa1 As Boolean = True, _
        Optional IgnoreCase As Boolean = False, _
        Optional Multiline As Boolean = False) _
    As Object Set RegExpFind = Nothing
						   
 'Пока не нашли ничего
 If Not str Like "" And Not Pattern Like "" Then
	
  Dim RegExp As Object
		
  'Для регулярного выражения
  Set RegExp = CreateObject("VBScript.RegExp")
  With RegExp
		
   'Нужны все совпадения или только первое?
   .Global = Globa1
			
   'Регистр неважен?
   .IgnoreCase = IgnoreCase
			
   'Игнорировать переносы строк?
   .Multiline = Multiline
			
   'Регулярка
   .Pattern = Pattern
			
  End With
		
  On Error Resume Next
  'Коллекция совпадений
  Set RegExpFind = RegExp.Execute(str)
  'Очистка памяти
  Set RegExp = Nothing
  
 End If
 
End Function

Пример использование в проекте VBA:

Dim objMatches As Object 'Коллекция совпадений
Dim objMatch As Object 'Отдельное совпадение
Dim strOriginal As String 'Оригинальная строка
Dim strPattern As String 'Регулярное выражение
Dim ro As Long 'Записывать результаты будем построчно

ro = 1 'Начнём с первой строки
strOriginal = "Извлекаем из предложения отдельные слова."
strPattern = "[А-ЯЁёа-я-]+" 'Русские буквы и дефис

'Получаем все совпадения
Set objMatches = RegExpFind(strOriginal, _
                 strPattern, True, True)

'Если функция применилась без ошибок
If Not objMatches Is Nothing Then 
 
 'Если совпадения есть
 If objMatches.Count > 0 Then
  
  'Перебираем совпадения по одному
  For Each objMatch In objMatches
   
   'Записываем сведения о подстроке
   With objMatch
   
    Cells(ro, 1) = ro 'Порядковый номер
    'Номер позиции в оригинальной строке
    Cells(ro, 2) = .FirstIndex
    Cells(ro, 3) = .Length 'Длина подстроки
    Cells(ro, 4) = .Value 'Подстрока
	
   End With
   
   ro = ro + 1 'Переход на следующую строку
   
  Next
  
 End If
 
End If
'Очистка памяти
Set objMatch = Nothing
Set objMatches = Nothing

'1 0 9 Извлекаем
'2 10 2 из
'3 13 11 предложения
'4 25 9 отдельные
'5 35 5 слова

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

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

Для тестирования в VBA регулярных выражений можно воспользоваться excel-приложением RegExp_Tester.