在EXCEL

时间:2016-01-11 21:10:38

标签: regex excel vba parsing

我试图分析在Excel选项卡中导入的文本文件。

第一列是用于表示操作时间轴的文本代码,我会将此文本代码转换为几秒钟。

文本代码可以这样格式化:

5,9h180s            ->  21420s
10min               ->  600s
3,4h5min30s         ->  12570s
...

我的想法是用正则表达式提取值,稍后在函数中使用它们,但我不太了解VBA。

EXCEL VBA中是否有函数对字符串执行正则表达式并从中提取数据?

您是否有此类功能的示例?

1 个答案:

答案 0 :(得分:1)

经过几次尝试各种组合(以及我自己的一些想象力)后,我决定在单位的第一个字母处截断时间值字符串,这样我就可以使用 h / < strong> m / s 作为 .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)

regex_timevalue

您应该注意(通过右对齐)这些值是真实数字,可以进行总计或以其他方式进行数学处理。已应用0\s_)的自定义数字格式掩码,以便将显示的 s 作为一个单元授予它们。

有关在VBA中使用正则表达式的优秀本地参考,请参阅How to use Regular Expressions (Regex) in Microsoft Excel both in-cell and loops