#regex #excel #excel-2007 #vba
#регулярное выражение #excel #excel-2007 #vba
Вопрос:
Я хочу извлечь строку из ячейки, используя совпадение регулярных выражений. Я не могу найти функцию Excel, которая это делает, и я тоже не эксперт по VBA. Я использую Excel 2007.
Ответ №1:
В редакторе кода Excel VBA выберите Инструменты / Ссылки. В окне выбора проверьте последнюю версию регулярных выражений Microsoft VBScript.
Вот простая пользовательская функция, которая поможет вам начать. Это вернет «foo», если вы укажете на ячейку с «foobar» или «fooooobar» в ней.
Function RegExtract(contents As String)
Dim regx As RegExp
Set regx = New RegExp
With regx
.Pattern = "f[o] "
With .Execute(contents)
If .Count Then RegExtract = .Item(0).Value
End With
End With
End Function
Комментарии:
1. grrr итак, мне нужно написать какой-нибудь VBA… Я надеялся, что смогу избежать этого.
2. Инструменты / ссылки выделены серым цветом … гул. Есть идеи.
3. обнаружил, что мои настройки безопасности предотвращают. Возникает небольшая ошибка MyExtract -> RegExtract
Ответ №2:
Вот функция, которая позволит вам передать ячейку, а затем любой шаблон регулярного выражения. Используйте () вокруг той части шаблона, которую вы хотите вернуть функцией.
Function RegexExtract(ByVal text As String, _
ByVal extract_what As String) As String
Dim allMatches As Object
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
RE.Pattern = extract_what
RE.Global = True
Set allMatches = RE.Execute(text)
RegexExtract = allMatches.Item(0).submatches.Item(0)
End Function
Ответ №3:
В системе VBA Excel доступна библиотека, известная как регулярные выражения Microsoft VBScript. Как только вы включите библиотеку из внутренней среды разработки VBA, вы можете создать простой макрос, который принимает любое значение, которое вы хотите проанализировать, и возвращает результат обратно вызывающему (который может быть вызовом функции из ячейки).
Комментарии:
1. помогите мне, как вы находите эту библиотеку и что вы называете VBA IDE. Я настоящий новичок в VB для Excel.
Ответ №4:
У @AndrewCowenhoven есть хороший ответ. Добавить библиотеку регулярных выражений просто. Просто чтобы немного расширить этот ответ, я добавлю то, что я узнал, чтобы получать элементы в совпадениях.
Например, у меня есть такая строка в одной ячейке.
doubleclick.net/activityi;u=5f2256de37ab4992927b3a0a0a34f983;u13=;u14=27.34;u16=AUD;u9=;u10=;u11=;u12=;u5=;u6=;u7=;u8=;u1=Car;u2=SEA;u3=SEA;u4=20130923 | 20130926;ord=5360319407191.128?
Мне нужно всего несколько разделов, чтобы убедиться, что тег doubleclick, отправленный в Google, верен. Используя регулярное выражение, показанное выше, я получаю что-то вроде этого.
Function CheckU3(contents As String)
Dim regx As RegExp
Set regx = New RegExp
Dim matches, s
With regx
.Pattern = "u3=(.*?);"
.Global = False
If regx.Test(contents) Then
Set matches = regx.Execute(contents)
For Each Var In matches.Item(0).SubMatches
s = Var
Next
End If
CheckU3 = s
End With
End Function
Я знаю, что это можно было бы значительно упростить, но дело в том, что я извлекаю подматчи, используя parans, чтобы получить именно то, что мне нужно.