我试图分析在Excel选项卡中导入的文本文件。
第一列是用于表示操作时间轴的文本代码,我会将此文本代码转换为几秒钟。
文本代码可以这样格式化:
5,9h180s -> 21420s
10min -> 600s
3,4h5min30s -> 12570s
...
我的想法是用正则表达式提取值,稍后在函数中使用它们,但我不太了解VBA。
EXCEL VBA中是否有函数对字符串执行正则表达式并从中提取数据?
您是否有此类功能的示例?
答案 0 :(得分:1)
经过几次尝试各种组合(以及我自己的一些想象力)后,我决定在单位的第一个字母处截断时间值字符串,这样我就可以使用 h / < strong> m / s 作为regex .Pattern property中的最后一个字符。这种前正则表达式准备给了我最好的结果。
在标准模块代码表中,
Function howManySeconds(strTM As String) As Long
Dim s As Long, tmp As String
Dim rgx As Object, cmat As Object
Dim x As Long, vPTTRNs As Variant
Set rgx = CreateObject("VBScript.RegExp")
vPTTRNs = Array("[0-9,\.,\s]{1,9}×$", _
"h", 3600, "m", 60, "s", 1)
With rgx
.Global = True
.IgnoreCase = True
For x = LBound(vPTTRNs) + 1 To UBound(vPTTRNs) Step 2
If CBool(InStr(1, LCase(strTM), vPTTRNs(x), vbTextCompare)) Then
tmp = Replace(Replace(Replace(LCase(strTM), _
"seconds", "s"), "secs", "s"), _
Chr(44), Chr(46))
tmp = Replace(Replace(Left(tmp, InStrRev(strTM, vPTTRNs(x), -1, vbTextCompare)), _
Chr(44), Chr(46)), Chr(32), vbNullString)
.Pattern = Replace(vPTTRNs(LBound(vPTTRNs)), Chr(215), vPTTRNs(x))
Set cmat = .Execute(tmp)
If CBool(cmat.Count) Then
s = s + CLng(CDbl(Replace(cmat.Item(0), vPTTRNs(x), vbNullString)) * vPTTRNs(x + 1))
End If
End If
Next x
End With
howManySeconds = s
Set rgx = Nothing
End Function
像任何本机工作表函数一样使用。在C2中,
=howManySeconds(A2)
您应该注意(通过右对齐)这些值是真实数字,可以进行总计或以其他方式进行数学处理。已应用0\s_)
的自定义数字格式掩码,以便将显示的 s 作为一个单元授予它们。
有关在VBA中使用正则表达式的优秀本地参考,请参阅How to use Regular Expressions (Regex) in Microsoft Excel both in-cell and loops。