先日、正規表現について調べてみました。
いや~。正規表現って、まるで暗号!コナンになったつもりで解読しないと。カンタンなのは読めるけど、ムズカシイやつはわたしの脳みそでは無理だ。。。
エクセルVBAでも正規表現が使えるとのことで、やってみました。
◆VBAで正規表現を使うにはVBScriptのRegExpを利用する
①参照設定で「Microsoft VBScript Regular Expressions 5.5」にチェック
または
②CreateObjectで実行時バインディングする。
Dim re As Object
Set re = CreateObject(“VBScript.RegExp”)
RegExp はRegular Expressions の略みたいですね。
◆RegExpを利用するには以下の手順で行う
1)事前準備
①検索範囲を設定(Globalプロパティ)
②大文字小文字の扱いの設定(IgnoreCaseプロパティ)
③検索文字列/パターンを設定(Patternプロパティ)
2)メソッドの実行
・存在チェック(test)
・置換(Replace)
・検索(Excute)
1)事前準備について:RegExpの3つのプロパティ
①Global : 検索範囲の設定
検索対象文字列の左端から1度だけ検索するか(=False)、1度見つかった後も右側の残りの文字列に対しても検索するか(=True)を指定します。規定値はFalse。
②IgnoreCase : 大文字小文字の扱いの設定
大文字小文字を区別するか。区別しない(=False)、区別する(=True)。規定値はFalse
③Pattern : 検索文字列/パターンを設定
検索したい正規表現のパターンを設定。
正規表現の記述方法については詳しくは末尾に参考とさせていただいた記事のリンクを載せています。
以下「事前準備」の例文
Dim re As RegExp ’正規表現クラスオブジェクト
Set re = New RegExp
re.Global = True ’検索範囲(True:文字列の最後まで検索)
re.IgnoreCase = True ‘大文字小文字の区別(True:区別しない)
re.Pattern = “abc” ’検索パターン”
2)メソッドの実行について : RegExpの3つのメソッド
①Test : 存在チェック
patternで設定した検索パターンが対象文字列に含まれるかどうかをBoolean型で返す。
合致した場合はTrue、合致しない場合はFalse.
Test(検索文字列)
例)(patternは上記で設定した”abc”。)
MsgBox ”判定: ” & re.Test(”abc980”)
テスト文字列「abc980」にabcが含まれるので「あったよ!」のTrueが返りました。
コード全文
'参照設定:Microsoft VBScript Regular Expressions 5.5
Sub test()
Dim re As RegExp '正規表現クラスオブジェクト
Set re = New RegExp
re.Global = True '検索範囲(True:文字列の最後まで検索)
re.IgnoreCase = True '大文字小文字の区別(True:区別しない)
re.Pattern = "abc" '検索パターン"
MsgBox "判定:" & re.test("abc123")
End Sub
②Replace : 置換
patternで設定した検索パターンにヒットした部分を「置換後文字列」に置換する。
Replace(検索文字列 , 置換後文字列)
例)(patternは上記で設定した”abc”。)
Dim str As String
str = re.Replace(“abc123”, “xyz”)
MsgBox str
Sub test()
Dim re As RegExp '正規表現クラスオブジェクト
Set re = New RegExp
re.Global = True '検索範囲(True:文字列の最後まで検索)
re.IgnoreCase = True '大文字小文字の区別(True:区別しない)
re.Pattern = "abc" '検索パターン"
Dim str As String
str = re.Replace("abc123", "xyz")
MsgBox str
End Sub
③ Excute : 検索
patternで設定した検索パターンにヒットした部分をMatchesCollectionに返す。
Excute(検索文字列)→ MatchesCollection に返す。
たとえば5個ヒットしたら、コレクションはアイテムが5こできる。
Sub test()
Dim re As RegExp '正規表現クラスオブジェクト
Set re = New RegExp
re.Global = True '検索範囲(True:文字列の最後まで検索)
re.IgnoreCase = True '大文字小文字の区別(True:区別しない)
re.Pattern = "abc" '検索パターン"
Dim vMatches As MatchCollection
'検索実行
Set vMatches = re.Execute("abc123")
'コレクションをループ
Dim i As Long, cnt As Long
cnt = vMatches.Count 'コレクションの数
For i = 0 To cnt - 1
Debug.Print "コレクション" & i & ":" & vMatches.Item(i)
Next
End Sub
結果(イミディエイトウインドウ)
コレクション0:abc
検索パターンを re.Pattern = ”[0-9]” としてみると。(数字、0~9どれでも、という指定)
1,2,3がそれぞれ引っ掛かりました。
結果(イミディエイトウインドウ)
コレクション0:1
コレクション1:2
コレクション2:3
ちなみに、ローカルでコレクションの中身を見ているとこうなっています。
最後に
正規表現は、慣れだな。。。と思います。
ほかにも正規表現記事あります(内部リンク)よろしければどうぞ。
【Excel/VBA】VBAで正規表現~郵便番号でやってみる
【Excel/VBA】VBAで正規表現~マッチした文字列の取り出し
参考文献・記事
以下の記事を参考とさせていただきました。
とてもわかりやすく書かれています。
VBAで正規表現(RegExp)を利用する | Excel作業をVBAで効率化 (vbabeginner.net)
VBAで正規表現を利用する(RegExp)|VBA技術解説 (excel-ubara.com)
【VBA入門】正規表現で文字列を抽出、置換する方法(RegExp) | 侍エンジニアブログ (sejuku.net)
正規表現とは?メタ文字とサンプル一覧
https://www-creators.com/archives/4278
コメント