gpt4 book ai didi

regex - 在 VBA 中返回正则表达式匹配(excel)

转载 作者:行者123 更新时间:2023-12-01 16:25:44 27 4
gpt4 key购买 nike

我正在尝试为 Excel 2010 编写一个函数,该函数将采用非结构化文本单元格,查找称为 sdi 值的内容,如果找到,则返回该数字。 sdi 值将显示为 sdi ####。我想要的是返回 sdi 及其后面的具体数字,因此如果单元格包含“some text sdi 1234 some more text”,该函数将返回 sdi 1234。

这是我的功能:

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 语句并忠实地返回空字符串。如果有 sdi 编号,我会得到#VALUE!

我错过了什么?

是的,VBScript 已启用。此外,我发现在 VBA 中使用正则表达式令人沮丧,并且很难在网上找到有用的信息。优质在线资源的链接将不胜感激。

谢谢

最佳答案

您需要访问比赛才能获取 SDI 号码。这是一个可以完成此操作的函数(假设每个单元只有 1 个 SDI 编号)。

对于正则表达式,我使用“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 函数。您可以传入第三个参数来分隔每个匹配项(例如用逗号分隔它们),然后在实际函数调用中手动输入模式:

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”,但您可以将其添加回来,或者如果您愿意,甚至可以将其添加为可选的第四个参数。

关于regex - 在 VBA 中返回正则表达式匹配(excel),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8146485/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com