假设我在一个单元格中有一个长字符串
答:1/2/15 校狗 9/20/19
B:(3个空格)1/8/16 学校猫 10/10/10
我想捕捉 1/2/15 和 1/8/16
问题是第一个字符串由 1 个空格分隔,第二个字符串由 3 个空格分隔
所以对我来说
myStringArr = Split(myString,” “)
MsgBox myStringArr(1)
myStringArr(1) = 1/2/15
仅适用于第一个字符串,不适用于第二个字符串
我可以使用什么来代替“单个空格”条件来解析字符串并每次捕获第一个日期
答案1
这很简单,只要字符串的结构就是这样。
dim tmp() as Variant
dim left_date, right_date as string
for each DatesinString in StringArray
tmp = split(LTrim(DatesinString), " ")
left_date = tmp(0)
right_date = tmp(Ubound(tmp))
next DatesinString
答案2
这是使用 Regex 的 VBA 解决方案。用户定义函数采用两个参数:单元格引用和匹配号。Regex Execute 方法返回所有匹配模式,函数根据请求返回相应的匹配(如果您想要返回输入字符串中的第二个日期)。匹配日期作为日期值返回,但可以通过删除 CDate() 函数将其修改为作为字符串返回。
Function ExtractDate(rng As Range, matchNum As Integer) As Variant
Dim matches As Object
Dim target As Variant
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
With regex
.Pattern = "(0?[1-9]|1[012])\/(0?[1-9]|[12][0-9]|3[01])\/[0-9]{2}"
.Global = True
End With
Set matches = regex.Execute(rng.Value)
If matchNum > 0 And matchNum <= matches.Count Then
target = CDate(matches.Item(matchNum - 1).Value)
Else
target = CVErr(xlErrNA)
End If
ExtractDate = target
End Function
使用示例:=ExtractDate(A1,2)
这将返回单元格 A1 中的字符串中找到的第二个日期