1

问:我应该使用哪个 Excel VBA RegEx 表达式来计算小数位数?

所需输出
这是一个包含一些示例输入字符串和所需输出的表格。

输入所需的输出
字符串最大值单位小数位
--------------------------------------------------
200A 200A 0
110kV 110kV 0
38,1兆瓦 38,1兆瓦 1
38,1 无功 38,1 无功 1
0-130℃ 130℃ 0
20-130℃ 130℃ 0
2000A 2000A 0
10 千伏 10 伏 0
34,6兆瓦 34,6兆瓦 1
34,6 无功 34,6 无功 1
600A 600A 0
114,3 兆瓦 114,3 兆瓦 1
114,3 无功 114,3 无功 1
2500A 2500A 0
300A 300A 0
500 A 500 A 0
100A 100A 0

到目前为止我所做
的 在这里您可以看到一个独立的 Excel VBA 代码。第一个子仅用于测试。
功能RegEx是我的问题。

Sub TestRegEx()
    strArray = Array("200 A", "200 A", "110 kV", "38,1MW", "38,1Mvar", _
            "0-130°C", "2000 A", "10 kV", "34,6MW", "34,6Mvar", "600 A", _
            "114,3 MW", "114,3 Mvar", "2500 A", "300 A", "500 A", "100 A")

    For i = 0 To UBound(strArray)
       Call RegEx(strArray(i))
    Next
End Sub

Function RegEx(ByVal strInput As String)

    Dim objRegEx As Object
    Set objRegEx = CreateObject("VBScript.RegExp")
    objRegEx.IgnoreCase = True
    objRegEx.Global = True

    'Show me the value
    objRegEx.Pattern = "[^0-9_,]"
    Debug.Print objRegEx.Replace(strInput, "")

    'Show me the unit
    objRegEx.Pattern = "[^A-Z_°]"
    Debug.Print objRegEx.Replace(strInput, "")

    'Show me the decimal places
    objRegEx.Pattern = "?????"
    Debug.Print objRegEx.Replace(strInput, "")

End Function

提示

  • 我想避免像 InStr 这样的普通 VBA 方法或循环遍历每个字符。
  • 也许VBALen方法可以用来计算字符串的长度。但是如果小数点为零,它将失败,或者?
  • 对我来说,正则表达式很难阅读。我所有的知识都基于这篇 MSDN 文章

感谢您对我最初关于如何计算小数位的问题的任何帮助。


PS:如果您对我的另外两个 RegEx 字符串unitvalue有建议,请告诉我。例如,我的正则表达式在“20-130°C”上失败。我不知道如何删除“-”中剩下的所有内容以仅提取值“130”。

4

3 回答 3

1

Cylian 的函数 GetDecPlaces 可以在不使用参数 decmark$ 的情况下重写。这可以通过表达式“ [.,] \d+$”中的正则表达式字符类[.,]来实现($ 符号表示“可搜索字符串的结尾”)。这允许句点小数和逗号小数。

Function GetDecPlaces(strInput$) As Integer
    'add a reference to Microsoft VBScript Regular Expressions 5.5
    Dim re As New RegExp, mts As MatchCollection, mt As Match
    With re
        .Global = True
        .Pattern = "[.,]\d+$"
        Set mts = .Execute(strInput)
        If mts.Count > 0 Then
            Set mt = mts.Item(0)
            .Pattern = "\d"
            Set mts = .Execute(mt.Value)
            GetDecPlaces = mts.Count
        Else
            GetDecPlaces = 0
        End If
    End With
End Function
于 2016-03-18T22:04:40.150 回答
0

这里不需要正则表达式!事实上,你可以用纯 Excel 公式做到这一点。假设您的值在 A 列中,从第 2 行开始,请尝试以下公式:

  • B2 - 删除空间:=SUBSTITUTE(A2," ","")
  • C2 - 删除 - 之前的数字:=IFERROR(MID(B2,SEARCH("-",B2)+1,LEN(B2)-SEARCH("-",B2)),B2)
  • D2 - 最后一个数字的位置:'=MAX(NOT(ISERROR(VALUE(LEFT(C2,ROW($A$2:$A$11)))))*ROW($A$2:$A$11))`(输入作为数组公式,即按Ctrl- Shift-Enter而不是Enter)
  • E2 - 最大值:=VALUE(LEFT(C2,D2))
  • F2 - 单位:=RIGHT(C2,LEN(C2)-D2)
  • G2 - 小数位:=IFERROR(D2-SEARCH(",",C2),0)
于 2013-01-30T10:42:58.350 回答
0

试试这个:

Function RegExTest(ByVal strInput As String)
    Dim objRegEx As Object, ret$
    Set objRegEx = CreateObject("VBScript.RegExp")
    With objRegEx
        .IgnoreCase = True
        .Global = True
        'printing value
        .Pattern = "[^0-9_,]"
        Debug.Print .Replace(strInput, "")
        ret = .Replace(strInput, "") & vbTab

        'printing unit
        .Pattern = "[^A-Z_°]"
        Debug.Print .Replace(strInput, "")
        ret = ret & .Replace(strInput, "") & vbTab

        'printing decimal places
        .Pattern = ","
        Debug.Print .Execute(strInput).Count
        ret = ret & CStr(.Execute(strInput).Count)
    End With
    RegExTest = ret
End Function

更新

要删除之前的部分-,请使用以下功能:

Function RegExTest(ByVal strInput As String)
    Dim objRegEx As Object, ret$
    Set objRegEx = CreateObject("VBScript.RegExp")
    With objRegEx
        .IgnoreCase = True
        .Global = True

        'printing value
        .Pattern = "[^0-9_,-]"'///<--do not delete hyphen now.
        Dim temp$
        temp = .Replace(strInput, "")
        .Pattern = "^.*?-"'///<-remove hyphen according to your need
        temp = .Replace(temp, "")
        Debug.Print temp
        ret = temp & vbTab


        'printing unit
        .Pattern = "[^A-Z_°]"
        Debug.Print .Replace(strInput, "")
        ret = ret & .Replace(strInput, "") & vbTab


        'printing decimal places
        .Pattern = ","
        Debug.Print .Execute(strInput).Count
        ret = ret & CStr(.Execute(strInput).Count)
    End With
    RegExTest = ret
End Function

更新 2

计算小数位数的功能:

Function GetDecPlaces(strInput$, Optional decmark$ = ",") As Integer
    'add a reference to
    'Microsoft VBScript Regular Expressions 5.5
    Dim re As New VBScript_RegExp_55.RegExp, mt As Match
    With re
        .Global = True
        .Pattern = decmark & "\d+"
        For Each mt In .Execute(strInput)
            .Pattern = "\d"
            GetDecPlaces = .Execute(mt.Value).Count
        Next mt
    End With
End Function

希望这可以帮助。

于 2013-01-30T10:53:07.463 回答