在VBA中返回一个正则expression式匹配(excel)

我想为excel 2010编写一个函数,它将采用非结构化文本的单元格,查找称为sdi值的东西,如果find,则返回该编号。 sdi值将显示为sdi ####。 我想要的是返回sdi和它后面的特定数字,所以如果单元格包含“一些文本sdi 1234多一些文本”,该函数将返回sdi 1234。

这是我的function:

Function SdiTest(LookIn As String) As String Dim temp As String Dim STA As Object temp = "" Set SDI = CreateObject("VBScript.RegExp") SDI.IgnoreCase = True SDI.Pattern = "sdi [1-9]*" SDI.Global = True If SDI.Test(LookIn) Then temp = SDI.Execute(LookIn) End If SdiTest = temp End Function 

如果没有sdi号码,它永远不会进入if语句,并忠实地返回空string。 如果有一个sdi号码,我会得到#VALUE!

我错过了什么?

是的,VBScript已启用。 另外,我发现在VBA中使用正则expression式令人沮丧,很难在网上find有用的信息。 链接良好的在线资源将不胜感激。

谢谢

您需要访问比赛以获得SDI号码。 这是一个可以实现的function(假设每个单元只有一个SDI号码)。

对于正则expression式,我用“sdi后跟一个空格和一个或多个数字”。 你有“sdi后面跟着一个空格和零个或更多的号码”。 你可以简单地把+改成我的模式,以回到你所拥有的模式。

 Function ExtractSDI(ByVal text As String) As String Dim result As String Dim allMatches As Object Dim RE As Object Set RE = CreateObject("vbscript.regexp") RE.pattern = "(sdi \d+)" RE.Global = True RE.IgnoreCase = True Set allMatches = RE.Execute(text) If allMatches.count <> 0 Then result = allMatches.Item(0).submatches.Item(0) End If ExtractSDI = result End Function 

如果一个单元格可能有多个您想要提取的SDI编号,这里是我的RegexExtract函数。 您可以传入第三个参数来分隔每个匹配(如逗号分隔它们),然后在实际的函数调用中手动input模式:

 Ex) =RegexExtract(A1, "(sdi \d+)", ", ") 

这是:

 Function RegexExtract(ByVal text As String, _ ByVal extract_what As String, _ Optional seperator As String = "") As String Dim i As Long, j As Long Dim result 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) For i = 0 To allMatches.count - 1 For j = 0 To allMatches.Item(i).submatches.count - 1 result = result & seperator & allMatches.Item(i).submatches.Item(j) Next Next If Len(result) <> 0 Then result = Right(result, Len(result) - Len(seperator)) End If RegexExtract = result End Function 

*请注意,我已经从我的RegexExtract中取出了“RE.IgnoreCase = True”,但是您可以将其添加回来,甚至可以将其添加为可选的第四个参数(如果您喜欢的话)。