Regex в excel. Как работают vba скрипты
Хочу разбить ФИО на Фамиилию Имя Отчество. Интересно сделать это через регулярки и vba. Код скрипта:
Public Function RegExpExtract(Text As String, Pattern As String, Item As Integer) As String
On Error GoTo ErrHandl
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = Pattern
regex.Global = True
If regex.Test(Text) Then
Set matches = regex.Execute(Text)
RegExpExtract = matches.Item(Item - 1)
Exit Function
End If
ErrHandl:
RegExpExtract = CVErr(xlErrValue)
End Function
Насколько я разобрался, функция RegExpExtract - принимает три аргумента: строку, паттерн, и номер_нужного_совпадения. Регулярное выражение "[А-Я-а-я]*" как раз разбивает строку на три подстроки,которые соответствуют имени,фамилии и отчеству. То-есть,если я передам третьим параметром "2"- получу имя,"3" - отчество.С единичкой работает,возвращается Фамилия. С 2 и 3 - нет. Я не особо понимаю структуру vba скрипта, и где строчка,ответственная за возвращения подстроки. Подскажите пожалуйста,как модифицировать код для моих нужд. Спасибо. P.s Понимаю,что это решение из разряда изобретения велосипеда,но все таки интересно разобраться в этом. Спасибо за понимание.
Ответы (1 шт):
Возврат значений в функциях VBA происходит через зарезервированную одноименную внешнюю переменную. В представленной функции это здесь:
Public Function RegExpExtract(Text As String, Pattern As String, Item As Integer) As String
On Error GoTo ErrHandl
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = Pattern
regex.Global = True
If regex.Test(Text) Then
Set matches = regex.Execute(Text)
Rem Вот здесь возврат значения через переменную RegExpExtract
RegExpExtract = matches.Item(Item - 1)
Exit Function
End If
ErrHandl:
Rem И вот здесь тоже возврат значения через переменную RegExpExtract
RegExpExtract = CVErr(xlErrValue)
End Function
Проверил работу представленной функции - все работает ожидаемым образом. Здесь все нормально.
У вас ошибка в паттерне. * - обозначает несколько символов или их отсутствие. Таким образом, пробел так же определяется как валидная последовательность символов. Вам нужно указать следующий паттер [А-Яа-я]+, где + - определяет от одного и более символов.
Проверить работу можно следующим образом:
Sub test()
Const pattern As String = "[А-Яа-я]+"
Const fio As String = "Иванов Петр Сидорович"
Debug.Print RegExpExtract(fio, pattern, 1)
Debug.Print RegExpExtract(fio, pattern, 2)
Debug.Print RegExpExtract(fio, pattern, 3)
End Sub
Результаты вывода можно увидеть в окне Immediate
Иванов
Петр
Сидорович
