1

次の方法でアイテムの説明とコードを含む大きなテーブルがあります。

"description [#######]" 
(Code being enclosed in "[]" and composed of 8 numbers)

コードと説明を異なる列に分ける必要があります。正規表現が必要な理由は、上記の説明が通常、次のようなExcelの数式内にあるためです。

=IF(xyz, "description1 [1######]", "description2 [2######]")

そのため、最終結果は次のようになります。

column 1: =IF(xyz, 1######, 2######)
column 2: =IF(xyz, "description1 ", "description2 ")

誰かが似たようなことをしましたか?これらの回答はある程度関連していることがわかりましたが、現在、正規表現を解読するのに十分な知識がありません。

VBAで正規表現の一致を返す(Excel)

日付に一致するVBA正規表現

4

3 に答える 3

1

これは最初の200行を反復処理します。これは非常に生のコードであり、エラーをキャッチしません。REには常に8つの数字があると想定しています。いずれかの数式に構文エラーがある場合、誤った数式をセルに割り当てようとするとエラーがスローされます。

Sub splitSpecial()
    Dim aParts As Variant
    Dim i As Long
    Dim RE As Object
    Dim ret As Object
    Dim sNewFormula As String

    Set RE = CreateObject("vbscript.regexp")

    For i = 1 To 200 'change 200 to be the last row
        aParts = Split(Range("A" & i).Formula, ",")
        RE.Pattern = "\[\d{8}\]"
        RE.Global = True
        Set ret = RE.Execute(Range("A" & i).Formula)
        If ret.Count <> 0 Then
            sNewFormula = aParts(0) & "," & Replace(Replace(ret.Item(0), "[", ""), "]", "") & _
                "," & Replace(Replace(ret.Item(0), "[", ""), "]", "") & ")"
            Range("B" & i).Formula = sNewFormula
            sNewFormula = aParts(0) & "," & Replace(aParts(1), ret.Item(0), "") & _
                "," & Replace(aParts(2), ret.Item(1), "")
            Range("C" & i).Formula = sNewFormula
        End If
    Next i

End Sub
于 2013-03-26T22:25:53.287 に答える
1

置換を使用すると、RegExp置換が簡単になります

このコードは、列Aでバリアント配列を使用し、結果は列BからDになります。

ここに画像の説明を入力してください

Sub Spliced()
Dim objRegex As Object
Dim objRegMC As Object
Dim X
Dim lngRow As Long
X = Range([a1], Cells(Rows.Count, "A").End(xlUp)).Formula
ReDim Preserve X(1 To UBound(X), 1 To 3)
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
    .Global = True
    .Pattern = """(\w+) (\[)(\d{8})(\])"""

For lngRow = 1 To UBound(X)
If .test(X(lngRow, 1)) Then
X(lngRow, 2) = .Replace(X(lngRow, 1), "$3")
X(lngRow, 3) = .Replace(X(lngRow, 1), """$1""")
End If
Next
End With
[b1].Resize(UBound(X, 1), 3) = X
End Sub
于 2013-03-27T05:25:17.170 に答える
0

コードが常に角かっこで囲まれ、常に8つの数字である場合...通常のテキスト検索式を使用できます。

    A1 = "DescriptionText1231 [CODE8DIG]"
    B1 = MID(B1,FIND("[",B1)+1,8)

私があなたの質問を理解したことを願っています。

于 2013-03-26T21:33:30.947 に答える