我有成千上万行文本需要处理,而我感兴趣的行如下所示:
01/04/2019 09:35:41 - Test user (Additional Comments)
我目前正在使用此代码过滤掉所有其他行:
If InStr(FullCell(i), " - ") <> 0 And InStr(FullCell(i), ":") <> 0 And InStr(FullCell(i), "(") <> 0 Then
FullCell是我正在处理的数组。
我知道这不是最好的方法。有没有办法检查字符串开头是否有日期,格式为dd / mm / yyyy,然后提取“-”和“(”符号之间的用户名。我玩过正则表达式,以查看是否有帮助,但是我的技能有限,无法在同一代码中同时实现VBA和正则表达式。
什么是最好的方法?
答案 0 :(得分:3)
假设Fullcell(i)
包含字符串,
If Left(Fullcell(i), 10) Like "##/##/####"
如果您有日期,则会返回True
(请注意,日期不会区分dd/mm/yyyy
和mm/dd/yyyy
。
还有
Mid(Fullcell(i), InStr(Fullcell(i), " - ") + 2, InStr(Fullcell(i), " (") - InStr(Fullcell(i), " - ") - 2)
将返回用户名
答案 1 :(得分:1)
我敢肯定有一种更有效的方法来执行此操作,但是我已经使用以下解决方案很多次了:
这将选择日期:
x = 1
Do While Mid(FullCell,1,x) <> " "
x = x + 1
Loop
strDate = Left(FullCell,x)
这将找到连字符的字符号,用户名以2个字符开头。
x = 1
Do While Mid(FullCell,x,1) <> "-"
x = x + 1
Loop
然后我们将找到用户名的结尾
y = x + 2
Do While Mid(FullCell,y,1) <> " "
y = y + 1
Loop
用户名现在应该是字符(x + 2到y-1)
strUsername = Mid(FullCell, x + 2, y - (x + 2) - 1)
答案 2 :(得分:1)
抽象是您的朋友,只要有可能,将它们分解为自己的私有函数总是有帮助的。您可以将代码放入函数中,然后调用类似ExtractUsername
的代码。
下面,我举了一个例子,我决定使用RegExp方法(后期绑定),但是您也可以像上面的示例一样使用字符串函数。
如果找到上面提到的模式,此函数将返回用户名,否则,将返回一个空字符串。
Private Function ExtractUsername(ByVal SourceString As String) As String
Dim RegEx As Object
Set RegEx = CreateObject("vbscript.regexp")
'(FIRST GROUP FINDS THE DATE FORMATTED AS DD/MM/YYY, AS WELL AS THE FORWARD SLASH)
'(SECOND GROUP FINDS THE USERNAME) THIS WILL BE SUBMATCH 1
With RegEx
.Pattern = "(^\d{2}\/\d{2}\/\d{4}.*-)(.+)(\()"
.Global = True
End With
Dim Match As Object
Set Match = RegEx.Execute(SourceString)
'ONLY RETURN IF A MATCH WAS FOUND
If Match.Count > 0 Then
ExtractUsername = Trim(Match(0).SubMatches(1))
End If
Set RegEx = Nothing
End Function
正则表达式模式分为三部分,日期(和斜杠),用户名和左括号。您感兴趣的是用户名,该用户名在SubMatch中将为数字1。
Regexr是一个练习正则表达式的有用站点,可以向您展示我使用的模式正在做的事情。
请注意,使用正则表达式可能会给您带来性能问题,您应该针对正则字符串函数对其进行测试,以查看哪种方法最适合您的情况。
答案 3 :(得分:1)
这就是我要怎么做
昏暗变量
Dim ring as Range
Dim dat as variant
Dim FullCell() as string
Dim User as string
Dim I as long
设置范围
Set rng = ` any way you choose
Dat = rng.value2
Loop dat
For i = 1 to UBound(dat, 1)
拆分数据
FullCell = Trim(Split(FullCell, "-"))
测试是否裂开
If UBound(FullCell) > 0 Then
测试是否匹配
If IsDate(FullCell(0)) Then
i = Instr(FullCell(1), "(")-1)
If i then
User = left$(FullCell(1), i)
' Found a user
End If
End If
End If
Next