【ExcelVBA・マクロ】RegExpオブジェクトの使い方|正規表現で複雑な文字列パターンを抽出・置換する方法【コピペOK】

ExcelVBA

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オブジェクトを使うと、InstrReplace関数だけでは難しい複雑な文字列パターンの判定・抽出・置換を、簡潔なコードで実現できます。CreateObjectで生成すれば参照設定も不要なため、配布するマクロにも組み込みやすい方法です。まずはTestで一致判定、Executeで抽出、Replaceで置換という3つの基本操作から使いこなしてみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました