vba word. Поиск ФИО в тексте

Рейтинг: 0Ответов: 1Опубликовано: 14.08.2023

В тексте документа надо найти и передать в переменную ФИО. Критерий ФИО: 3 слова: первое слово все ЗАГЛАВНыЕ, второе и третье - первая буква заглавная, остальные строчные. Из текста "прошу предоставить мне ИВАНОВУ Ивану Ивановичу автомобить" макрос должен вывести "ИВАНОВУ Ивану Ивановичу".

Мой код не выдает нужен результат, хотя на https://regex101.com/ этот паттерн отрабатывает

Sub ExtractNameFromText()
    Dim doc As Document
    Dim findRange As Range
    Dim regexPattern As String
    Dim foundText As String
    
    ' Set up the Word document and search range
    Set doc = ActiveDocument
    Set findRange = doc.Content
    Debug.Print findRange.Text
    ' Define the regular expression pattern to match the desired name format
    regexPattern = "[А-ЯЁЇІЄ]+ [А-ЯЁЇІЄ][а-яёіїє]+ [А-ЯЁІЇЄ][а-яёіїє]+"
    
    ' Find the pattern and store in a variable
    If findRange.Find.Execute(findText:=regexPattern, MatchWildcards:=True, Forward:=True, Wrap:=wdFindStop) Then
        foundText = findRange.Text
        MsgBox "Found name: " & foundText
    Else
        MsgBox "Name not found."
    End If
End Sub

Ответы

▲ 4Принят

В стандартном поиске Word использует не RegExp, а Wildcards. Поэтому синтаксис выражения должен быть другим:

regexPattern = "<[А-ЯЁ]@> <[А-ЯЁ][а-яё]@> <[А-ЯЁ][а-яё]@>"

В частности, отличия - вместо + применяется @. Также целесообразно использовать символы < и > для поиска начала и конца слова.
Примечание. Возможность использовать именно RegExp через VBA имеется, для этого нужно создать объект VBScript.RegExp, например, так: Set myRegExp = CreateObject("VBScript.RegExp"), забрать весь текст документа в переменную txt = ActiveDocument.Content.Text и в нем искать через созданный объект.