1

Q:小数点以下の桁数を数えるには、どの Excel VBA RegEx 式を使用すればよいですか?

望ましい出力
これは、入力文字列の例と望ましい出力を示した表です。

入力 必要な出力
文字列 最大値 単位 小数点以下の桁数
--------------------------------------------------
200A 200A 0
110kV 110kV 0
38,1MW 38,1MW 1
38,1Mvar 38,1Mvar 1
0~130℃ 130℃ 0
20~130℃ 130℃ 0
2000A 2000A 0
10kV 10V 0
34.6MW 34.6MW 1
34,6Mvar 34,6Mvar 1
600A 600A 0
114,3 MW 114,3 MW 1
114,3 Mvar 114,3 Mvar 1
2500A 2500A 0
300A 300A 0
500A 500A 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: unitvalueの他の 2 つの RegEx 文字列について提案がある場合は、お知らせください。たとえば、私のの正規表現は「20-130°C」で失敗します。「-」から残っているものをすべて削除して、値「130」のみを抽出する方法がわかりません。

4

3 に答える 3

1

Cylian の関数 GetDecPlaces は、パラメータ decmark$ を使用せずに書き換えることができました。これは、「[.,] \d+$」という式の正規表現文字クラス[.,]によって実現できます($ 記号は「検索可能な文字列の末尾」を意味します)。これにより、ピリオド 10 進とコンマ 10 進の両方が可能になります。

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 数式でこれを行うことができます。値が行 2 から始まる列 A にあると仮定して、次の式を試してください。

  • 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-を押しますEnterEnter
  • 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 に答える