2

の経験がなく、古代のJavaの知識に頼っています

以下の形式のデータがあり、001-222-170 コンポーネントを抽出したい (1 行目などから)

TEXT,TEXT,TEXT,001-222-170,TEXT    
LINER,612-942-001,TEXT    
TEXT,TEXT17,612-551-001,TEXT   
SHOE,435-687-204,TEXT    
TEXT,ASSY,O.B,632-005-202,TEXT    
TEXT,TEXT,I.B,632-012-202,TEXT

.pattern広範な調査の結果、認識を設定する必要があることがわかりました。私が持っている最も近いものは

Sub RegEx()
    Dim RegEx As Object
    Dim strTest As String
    Dim valid As Boolean
    Dim Matches As Object
    Dim i As Integer

    Set RegEx = CreateObject("VBScript.RegExp")
    'What I happen to be looking for    
    RegEx.Pattern = "MT\d{6}V\d"

    For i = 2 To 115
        Range("B" & i).Activate
        strTest = ActiveCell.Text
        valid = RegEx.test(strTest)
        If valid = True Then
            Set Matches = RegEx.Execute(strTest)
            Range("C" & i).Value = CStr(Matches(0))
        Else
            Range("C" & i).Value = "#N/A#"
        End If
    Next

    Set RegEx = Nothing
End Sub

しかし、それでもうまくいきません。さらに、これを行うためのより短い方法があることも知っています。パターン行をフォーマットする方法がわかりません。みたいな ("(\d)"-"(\d)"-"(\d)")

4

5 に答える 5

2
RegEx.Pattern = "\d{3}\-\d{3}\-\d{3}"
于 2012-06-22T15:10:35.280 に答える
1

以下のコードは、RegExp UDF を C2:C115 に 1 回のショット (ループなし) でダンプして、それぞれ B2:b115 で実行します。

正規表現は次のように短縮できます (\d{3}\-){2}\d{3}"

Sub DumpReg()
    Range("C2:115").FormulaR1C1 = "=EXTRACT1(RC[-1])"
End Sub

Function Extract1(strIn As String) As String
    Dim objRegex As Object
    Dim objRegMC As Object
    Set objRegex = CreateObject("vbscript.regexp")
    With objRegex
        .Pattern = "(\d{3}\-){2}\d{3}"
        If .test(strIn) Then
            Set objRegMC = .Execute(strIn)
            Extract1 = objRegMC(0)
        Else
            Extract1 = "#N/A#"
        End If
    End With
End Function
于 2012-06-23T02:46:48.350 に答える
0

フォーマットが同じで、VBAソリューションが必要な場合、正規表現はこの種のことにはやり過ぎです。これが使用する簡単な方法ですSPLIT()

Sub Sample()
    Dim MyAr() As String, strSample As String

    strSample = "TEXT,TEXT,TEXT,001-222-170,TEXT"
    'strSample = "LINER,612-942-001,TEXT"

    MyAr = Split(strSample, ",")

    Debug.Print MyAr(UBound(MyAr) - 1)
End Sub
于 2012-06-22T17:44:06.560 に答える
0

データが常に必要な XXX-XXX-XXX 形式である場合は、VBA や RegEx を使用せずにスプレッドシートにこの書き込みを行うことができます。

例

VBA ソリューションの更新

これは、RegExp を使用しない、より単純な VBA ソリューションでもあります。

注意 - このソリューションでは、XXX-XX-XXX パターン以外に、セル テキスト パターンに "-" のインスタンスが他にないことを前提としています。

Sub dude()

Dim strTest As String

For i = 2 To 115

    strTest = Range("A" & i).Text

    If InStr(1, strText, "-") > 0 Then
        Range("C" & i) = Mid(strTest, InStr(1, strText, "-") - 3, 11)
    Else
        Range("C" & i) = "#N/A#"
    End If

Next

End Sub
于 2012-06-22T14:58:13.733 に答える
0

使用できるパターンは次のとおり\d+-\d+-\d+ です。 \d+単に 1 つ以上の小数を意味します。サブは次のように記述できます。

Sub RegEx()
    Dim RegEx As Object
    Dim strTest As String
    Dim valid As Boolean
    Dim Matches As Object
    Dim i As Integer

    Set RegEx = CreateObject("VBScript.RegExp")

    RegEx.Pattern = "\d+-\d+-\d+"

    For i = 2 To 115
        strTest = Range("B" & i).Text
        Set Matches = RegEx.Execute(strTest)
        If Matches.Count > 0 Then
            Cells(i, "C").Value = CStr(Matches(0))
        Else
            Cells(i, "C").Value = "#N/A#"
        End If
    Next

    Set RegEx = Nothing
End Sub
于 2012-06-22T14:58:56.033 に答える