RegExpオブジェクトとは
RegExp(Regular Expression)オブジェクトは、VBAで「正規表現」を使った文字列処理を行うためのオブジェクトです。正規表現とは、文字列のパターンをルールとして表現する仕組みで、Instr関数やReplace関数だけでは対応しきれない、複雑な文字列の抽出・判定・置換を一発で行えるのが特徴です。
たとえば「文字列の中からメールアドレスだけを取り出したい」「全角数字だけで構成されているかを判定したい」といった処理は、通常の文字列関数を組み合わせるとコードが長くなりがちですが、正規表現を使えば数行で実現できます。この記事では、RegExpオブジェクトの基本的な使い方から、実務で使える具体的なコード例までを解説します。
RegExpオブジェクトを使う準備
RegExpオブジェクトを使うには、大きく分けて「参照設定を行う方法(早期バインディング)」と「CreateObjectを使う方法(後期バインディング)」の2通りがあります。
参照設定で使う方法
VBEの「ツール」→「参照設定」から「Microsoft VBScript Regular Expressions 5.5」にチェックを入れると、New RegExpという書き方でオブジェクトを生成できます。コード補完が効くため開発中は便利ですが、他のPCで実行する際に参照設定が外れているとエラーになる点に注意が必要です。
Dim re As New RegExp
CreateObjectで使う方法
参照設定なしで使いたい場合は、CreateObject関数を使います。この方法なら参照設定不要で、どの環境でもそのまま動作するため、配布するマクロにはこちらがおすすめです。
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
以降のサンプルコードは、環境を選ばないCreateObject方式で統一します。
基本的な使い方
RegExpオブジェクトには主に「Pattern」「Test」「Execute」「Replace」という4つの重要なプロパティ・メソッドがあります。
| プロパティ/メソッド | 説明 |
|---|---|
| Pattern | 検索する正規表現パターンを指定する |
| IgnoreCase | 大文字・小文字を区別しないかどうか(True/False) |
| Global | 文字列全体を検索対象にするかどうか(True/False) |
| Test | パターンに一致するかどうかをTrue/Falseで判定する |
| Execute | 一致した文字列を1件ずつ取得する |
| Replace | 一致した文字列を置換する |
文字列がパターンに一致するかを判定する(Test)
もっともシンプルな使い方が、Testメソッドによる一致判定です。以下は、文字列が半角数字のみで構成されているかを判定する例です。
Sub RegExpTestSample()
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "^[0-9]+$"
re.IgnoreCase = False
Debug.Print re.Test("12345") '→ True
Debug.Print re.Test("123a5") '→ False
End Sub
^は文字列の先頭、$は文字列の末尾を表し、[0-9]+は「半角数字が1文字以上続く」ことを意味します。この3つを組み合わせることで「文字列全体が半角数字だけかどうか」を判定できます。
一致した文字列を取得する(Execute)
文字列の中から一致する部分だけを抜き出したい場合は、Executeメソッドを使います。戻り値はMatchCollectionというコレクションになるため、For Eachでループして中身を取り出します。
Sub RegExpExecuteSample()
Dim re As Object
Dim matches As Object
Dim m As Object
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "[0-9]+"
re.Global = True
Set matches = re.Execute("商品A:1000円、商品B:2500円")
For Each m In matches
Debug.Print m.Value
Next m
'イミディエイトウィンドウに 1000 と 2500 が表示される
End Sub
GlobalプロパティをTrueにすることで、最初の1件だけでなく文字列全体から一致箇所をすべて取得できます。
正規表現で文字列を置換する(Replace)
Replaceメソッドを使うと、パターンに一致した部分をまとめて別の文字列に置換できます。標準のReplace関数と違い、パターンにマッチした「不特定多数の文字列」を一括で置換できるのが強みです。
Sub RegExpReplaceSample()
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "[0-9]+"
re.Global = True
Dim target As String
target = "商品A:1000円、商品B:2500円"
Debug.Print re.Replace(target, "***")
'→ 商品A:***円、商品B:***円
End Sub
数値部分だけをマスクしたり、不要な記号を一括で削除したりする際に役立ちます。
実践例
メールアドレスだけを抽出する
セルに入力された文章の中からメールアドレスだけを抜き出したい場合の実践例です。
Sub ExtractEmailAddress()
Dim re As Object
Dim matches As Object
Dim m As Object
Dim target As String
target = Range("A1").Value
'例: "お問い合わせは sample@example.com までお願いします"
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+"
re.Global = True
Set matches = re.Execute(target)
If matches.Count > 0 Then
For Each m In matches
Debug.Print m.Value
Next m
Else
Debug.Print "メールアドレスが見つかりませんでした"
End If
End Sub
matches.Countで一致件数を確認できるため、見つからなかった場合の分岐も簡単に書けます。
セルの値が全角数字だけで構成されているかチェックする
入力チェックの場面でよく使う、全角数字の判定例です。
Sub CheckZenkakuNumber()
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "^[0-9]+$"
Dim c As Range
For Each c In Range("A1:A10")
If c.Value <> "" Then
If re.Test(c.Value) Then
Debug.Print c.Address & ":全角数字のみ"
Else
Debug.Print c.Address & ":全角数字以外を含む"
End If
End If
Next c
End Sub
よくあるエラーと対処法
- 「オブジェクトが必要です」というエラーが出る:
Set re = CreateObject("VBScript.RegExp")のSetを書き忘れているケースがほとんどです。オブジェクトを変数に代入する際は必ずSetを使います。 - Executeの結果を直接使おうとしてエラーになる:
Executeの戻り値は文字列ではなくコレクションです。中身を取り出すには必ずFor Eachでループするか、matches(0).Valueのようにインデックス指定でアクセスします。 - Globalをつけ忘れて2件目以降が取得できない:
Globalプロパティが既定値のFalseのままだと、最初の1件しか処理されません。複数件を扱う場合は必ずre.Global = Trueを設定してください。
まとめ
RegExpオブジェクトを使うと、InstrやReplace関数だけでは難しい複雑な文字列パターンの判定・抽出・置換を、簡潔なコードで実現できます。CreateObjectで生成すれば参照設定も不要なため、配布するマクロにも組み込みやすい方法です。まずはTestで一致判定、Executeで抽出、Replaceで置換という3つの基本操作から使いこなしてみてください。


コメント