Кстати, в
FixCell \(? и
\)? необязательны - их можно удалить.

Привожу пояснение с этой поправкой.
Код |
---|
.Pattern = "^(.+)\s+.+$" |
Всё очень просто.
^ и
$ определяют всю строку.
Раз нам надо "до последнего пробела", то мы знаем, что первый пробел с конца.
Символ
$ нам даёт конец текста.
.+ даёт весь текст в конце, а
\s+ и есть наш последний пробел.
Всё, что до него - это наша искомая строка, то есть с начала строки
^ до последнего пробела
\s+.
LastPart.
Тут принцип такой же, что и в
FixCell, но я увидел, что в некоторых словах нет скобок вокруг последнего слова. А так как автору нужен текст без скобок, то
\(? и
\)? помогают нам исключить их, если таковые есть. Другими словами, если их не написать, то
(.+?) заберёт и скобки, но они нам не нужны. Остальное - всё как в
FixCell.
Что касается
SubMatches(0), то это просто наш искомый текст, заключённый в скобки. Он считается слева направо: первый - 0, второй - 1 и так далее.
Если использовать Early Binding, то можно расписать попонятней и подробней. Для этого указываем библиотеку (Tools -> References ->Microsoft VBScript Regular Expressions 5.5).
Код |
---|
Function LastPart(cell As Range)
Dim re As RegExp
Dim mc As MatchCollection
Dim m As Match
Dim submc As SubMatches
Set re = New RegExp
re.Pattern = "^.+\s+\(?(.+?)\)?$"
Set mc = re.Execute(cell.Value)
Set m = mc.Item(0)
Set submc = m.SubMatches
LastPart = submc.Item(0)
End Function |