このサイトの記事内では「アフィリエイト広告」などの広告を掲載している場合があります。
消費者庁が問題としている「誇大な宣伝や表現」とならないよう配慮しコンテンツを制作しておりますのでご安心ください。
問題のある表現が見つかりましたらお問い合わせよりご一報いただけますと幸いです。

【VBA】正規表現(RegExp)を使う方法(パターン一致と置換を説明)

2023年9月20日

今回はVBAで正規表現を使う方法を紹介します。

この記事では↓の内容が分かります。

  1. 正規表現とはどのようなものか
  2. 正規表現によるパターン一致の確認
  3. 正規表現にマッチした文字列を置換する
  4. パターン一致した文字列を抽出する

単純なワイルドカードを含めた一致を判定するだけならば、Like演算子を使う方法のがシンプルでおすすめです。

VBAが難しいと感じたら
プロにお任せして代わりに作ってもらうのはいかがでしょうか?
マクロの作成請負をしていますので、こちらからご相談ください。

正規表現とは

正規表現とは、ある特定のパターンを持つ文字列を指定する表記法の一つ。文字列の検索や置換、抽出などを行う際の対象の指定などのために用いられる。

出典:IT用語辞典 e-Words

例えば、\dが任意の数字を表したり、\wが任意の文字を表したりします。

また、前方一致や後方一致といった指定の仕方もできます。

なお、VBAで正規表現を使用する場合、VBScript内のライブラリを使用します。参照設定を追加する方法もありますが、今回はCreateObjectで参照する方法でお見せします。

正規表現によるパターン一致の確認(testメソッド)

Sub Sample1()
    
    'RegExpオブジェクトの生成
    Dim reg As Object
    Set reg = CreateObject("VBScript.RegExp")
    
    With reg
        .Pattern = "\d" 'パターン(正規表現)を指定
        .IgnoreCase = False '大文字と小文字を区別するか
        .Global = True '文字列全体を検索
        
        'パターン一致判定
        If .test("123456789a") Then
            MsgBox "パターンと一致します"
        Else
            MsgBox "パターンと一致しません"
        End If
    End With
End Sub

このサンプルコードを元にパターン一致の確認方法を紹介します。

    With reg
        .Pattern = "\d" 'パターン(正規表現)を指定
        .IgnoreCase = False '大文字と小文字を区別するか
        .Global = True '文字列全体を検索

正規表現を使う場合、最初に正規表現のパターンの指定などを行います。

        'パターン一致判定
        If .test("123456789a") Then
            MsgBox "パターンと一致します"
        Else
            MsgBox "パターンと一致しません"
        End If

準備が終わった後、testメソッドを使用してパターン一致の確認をします。

testメソッドは引数がパターンと一致するときはTrueを一致しないときはFalseを返します。

パターン一致を確認したいときはtestメソッドを使うと覚えてください。

        .Pattern = "^\d" '前方一致
        .Pattern = "\d$" '後方一致
        .Pattern = "\d{10}" '連続した数値が10個ある

一度実行してみたら、パターンを↑のように変更して色々と試してみましょう。

何度も試してみると正規表現の理解が深まりますよ。

正規表現にマッチした文字列を置換する(Replaceメソッド)

Sub Sample2()
    
    'RegExpオブジェクトの生成
    Dim reg As Object
    Set reg = CreateObject("VBScript.RegExp")
    
    With reg
        .Pattern = "\d" 'パターン(正規表現)を指定
        .IgnoreCase = False '大文字と小文字を区別するか
        .Global = True '文字列全体を検索
        
        '文字列を置換
        MsgBox .Replace("12a45b78c", "W")
    End With
End Sub

正規表現による文字列の置換はReplaceメソッドを使います。

Replaceメソッドは1つ目の引数から、パターンと一致した文字列を、2つ目の引数へ置換します。

サンプルコードではパターンを数値にしているため、文字列内の124578がWに置換されます。

パターン一致した文字列を抽出する方法 (Executeメソッド)

Sub Sample3()
    
    'RegExpオブジェクトの生成
    Dim reg As Object
    Set reg = CreateObject("VBScript.RegExp")
    
    With reg
        .Pattern = "\d" 'パターン(正規表現)を指定
        .IgnoreCase = False '大文字と小文字を区別するか
        .Global = True '文字列全体を検索
        
        'Executeメソッドでパターン一致した文字列を抽出
        'MatchCollection型で結果が得られる
        Dim mc As Object, m As Object
        Set mc = .Execute("12a45b78c")
        
        'MatchCollectionから1つずつ結果を取り出し
        For Each m In mc
            'Valueプロパティで一致した文字列を取り出し
            Debug.Print m.Value '1 2 4 5 7 8
        Next
    End With
End Sub

正規表現ではパターンにマッチした文字列を抽出(取り出す)こともできます。

        Set mc = .Execute("12a45b78c")

文字列の抽出にはExecuteメソッドを使います。

Executeメソッドを使うとパターン一致した文字列をコレクションの形で取得できます。 (正確にはMatchCollectionといいます)

        For Each m In mc
            'Valueプロパティで一致した文字列を取り出し
            Debug.Print m.Value '1 2 4 5 7 8
        Next

パターン一致した文字列を取り出すにはサンプルコードのようにFor Each文を使うかItemメソッドで取り出します。

あとは各パターンに対してValueプロパティを使うことで、一致した文字列を取り出すことができます。

サンプルコードでは「1 2 4 5 7 8」がパターン一致しているため、これらの文字列が順番に表示されます。

VBAが難しいと感じたら
プロにお任せして代わりに作ってもらうのはいかがでしょうか?
マクロの作成請負をしていますので、こちらからご相談ください。

VBA

Posted by やろまい