VBAで正規表現のテストを自動化する
マッチングのテスト自動化
VBAで正規表現を使う場合、その正規表現の網羅テストするためには自動化するのが良い。まずは、マッチするかをチェックするテストツールを作ってみた。
ソースコードは以下のような感じ。本当は事前の入力チェックも書くべきだが、ここでは端折った。
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回、テスト実行ボタンをクリックしている。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メソッドを使っている。
関連ページ