VBAで正規表現のテストを自動化する

マッチングのテスト自動化

VBAで正規表現を使う場合、その正規表現の網羅テストするためには自動化するのが良い。まずは、マッチするかをチェックするテストツールを作ってみた。

図1:マッチングのテスト自動化。期待結果と異なる場合は、セルが赤くなる

ソースコードは以下のような感じ。本当は事前の入力チェックも書くべきだが、ここでは端折った。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Sub autoRegexTest()
    Dim st:       Set st = ThisWorkbook.Worksheets("Sheet1")
    Dim startrow: startrow = 4
    Dim endRow:   endRow = st.Range("C4").End(xlDown).Row

    ' 書式のクリア
    st.Range("O4:R" & endRow).Interior.ColorIndex = 0

    ' RegExpオブジェクトの作成
    Dim reg As Object
    Set reg = CreateObject("VBScript.RegExp")

    ' パターンの設定
    reg.Pattern = st.Range("E1").Text

    ' チェック対象範囲のループ
    Dim wkRow, result, expected
    For wkRow = startrow To endRow
        ' 期待結果をboolean型に変換
        expected = IIf(st.Range("K" & wkRow).Text = "○", True, False)

        ' 正規表現のテスト実行して、シートに結果を出力
        result = reg.Test(st.Range("C" & wkRow).Text)
        st.Range("O" & wkRow) = IIf(result, "○", "×")

        ' 期待結果の実際の結果が不一致の場合は背景色を赤色に変える
        If result <> expected Then
            st.Range("O" & wkRow).Interior.ColorIndex = 3
        End If
    Next

    Set st = Nothing
    Set reg = Nothing
End Sub

置換処理のテスト自動化

まずは、どのような動きをするかを動画で示す。ちなみにこの動画で試している正規表現は、CSVでフィールド内にカンマがあるときの話で紹介したものだ。

図2:置換処理のテスト

この例では、正規表現にマッチした文字を@に置換しようとしており、正規表現が期待通りの結果を生み出すか、確認している。テスト結果の列には、置換後の文字列を出力している。

動画では2回、テスト実行ボタンをクリックしている。1回目は全て期待通りに動作することが確認されるが、2回目は敢えて不正な正規表現に変更して実行し、赤色については期待通りの結果が得られていないことを確認した。

次にソースコードを示す。ほとんど前回と同じだ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Sub autoRegexTest2()
    Dim st:       Set st = ThisWorkbook.Worksheets("Sheet2")
    Dim startrow: startrow = 5
    Dim endRow:   endRow = st.Range("C4").End(xlDown).Row

    ' 書式のクリア
    st.Range("S5:Z" & endRow).Interior.ColorIndex = 0

    ' RegExpオブジェクトの作成
    Dim reg As Object
    Set reg = CreateObject("VBScript.RegExp")

    ' プロパティの設定
    reg.Pattern = st.Range("E1").Text
    reg.Global = True ' マッチした部分を全て置換する

    Dim repPattern: repPattern = st.Range("E2").Text ' 置換後のパターン

    ' チェック対象範囲のループ
    Dim wkRow, target, result, expected
    For wkRow = startrow To endRow
        ' チェック対象文字列と期待結果を取得
        target = st.Range("C" & wkRow).Text
        expected = st.Range("K" & wkRow).Text

        ' 正規表現のテスト実行して、シートに結果を出力
        result = reg.Replace(target, repPattern)
        st.Range("S" & wkRow) = result

        ' 期待結果の実際の結果が不一致の場合は背景色を赤色に変える
        If result <> expected Then
            st.Range("S" & wkRow).Interior.ColorIndex = 3
        End If
    Next

    Set st = Nothing
    Set reg = Nothing
End Sub

前回と異なるポイントとしては、まず16行目だ。マッチした文字を全て置換したいので、globalプロパティをTrueに設定している。また、28行目では前回のTestメソッドの代わりにReplaceメソッドを使っている。

関連ページ