【2026年7月最新】VBAの正規表現(RegExp)完全ガイド|文字列抽出・置換・マッチングをコード例付きで解説

【2026年7月最新】VBAの正規表現(RegExp)完全ガイド|文字列抽出・置換・マッチングをコード例付きで解説

「メールアドレスが正しい形式かどうかをVBAで検証したい」「電話番号や郵便番号をセルから一括抽出したい」「特定のパターンに一致する文字列を全件置換したい」——こうした要件に最も強力な手段が「VBAの正規表現(RegExp)」です。Excelの関数だけでは手が届かない、複雑な文字列処理を1本のパターン文字列で実現できます。

この記事では、VBAでの正規表現の使い方を完全に解説します。RegExpオブジェクトの作成・基本設定(Pattern・IgnoreCase・Global)から、Test/Execute/Replace各メソッドの使い方、メタ文字一覧、メールアドレス・電話番号・URLの実用パターン、業務での活用例まで、コード例を豊富に交えて説明します。

代表菅澤 代表菅澤
弊社でVBAを使って業務自動化をするとき、「文字列の検証・抽出・整形」の場面で正規表現を使えるかどうかで作業効率が大きく変わります。InStr関数やLike演算子では手に負えない複雑なパターンを、RegExpオブジェクトなら1行で処理できます。最初は難しく感じますが、基本パターンを覚えれば業務コードに即応用できます。
✔️RegExpオブジェクトの作成:CreateObject("VBScript.RegExp")の書き方とプロパティ設定
✔️正規表現メタ文字:.・*・+・?・^・$・[]・{}・|・()の意味と使い方
✔️Testメソッド:パターンにマッチするかTrue/Falseで判定する
✔️Executeメソッド:MatchesコレクションでFirstIndex・Length・Valueを取得
✔️Replaceメソッド:パターンに一致した部分を別の文字列に置換する
✔️実用パターン集:メールアドレス・電話番号・郵便番号・URLの検証・抽出に即使えるコード
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理
📌 この記事の結論
【2026年7月最新】VBAの正規表現(RegExp)完全ガイド|文字列抽出・置換・マッチングをコード例付きで解説
VBAの正規表現(RegExp)を完全解説。RegExpオブジェクトの設定方法・Patternの書き方・Executeでマッチング・Replaceで置換・Test/Matchesコレクションの使い方を実践コード例付きで解説。メールアドレス・電話番号・URLなどの抽出に即使えます。

01 正規表現とは何か・VBAで使う理由 文字列のパターンマッチングを記号で表現する強力な仕組み

正規表現(Regular Expression)とは、文字列のパターンを表現するための「記号の記法」です。たとえば「数字3桁-数字4桁の電話番号」というパターンを、正規表現では \d{3}-\d{4} と書けます。このパターンを使って「文字列がこのパターンに一致するか(検証)」「パターンに一致する部分を取り出す(抽出)」「パターンに一致する部分を置換する(置換)」という3つの操作が行えます。

VBAには標準で強力な文字列関数(InStr・Mid・Left・Right・Replace・Like)がありますが、「複数の条件を組み合わせた複雑なパターン」「繰り返しの表現」「位置指定(先頭・末尾)」などはこれらの関数では記述が困難です。正規表現を使えば、こうした複雑な条件を1本のPattern文字列で表現できます。

📚 用語解説

正規表現(Regular Expression):文字列のパターンを記号で表現するための言語仕様。「どんな文字が」「何個」「どの位置に」来るかをメタ文字(.・*・+・?・[]・^・$・{}・|・()等)で記述します。VBAではCreateObject("VBScript.RegExp")でRegExpオブジェクトを生成し、Patternプロパティにパターン文字列を設定して使います。

操作VBA標準関数正規表現(RegExp)正規表現が優れる場面
パターン検証Like演算子(限定的)Test → True/False複雑な条件(メールアドレス形式等)
文字列抽出Mid/InStr(固定位置)Execute → Matchesコレクション可変位置・複数マッチの一括取得
文字列置換Replace(固定文字列)Replace(パターン→置換)パターンに一致する全箇所の一括置換
繰り返し表現不可(ループで対処){n}・{n,m}・+・*「2〜5桁の数字」など範囲指定が簡潔
文字列データ
セル・変数・ファイル内容
RegExpオブジェクト
Pattern設定
Test / Execute
/ Replace

3つのメソッド
結果取得
True/False・Matches・置換文字列
業務処理へ
バリデーション・抽出・整形
AI鬼管理山崎 AI鬼管理山崎
VBAで正規表現を使うには「Microsoft VBScript Regular Expressions 5.5」という参照設定を追加するか、CreateObjectで動的にオブジェクトを生成します。CreateObjectを使えば参照設定なしで動作するため、配布するマクロでは参照設定不要のCreateObject方式が推奨です。

02 RegExpオブジェクトの作成と基本設定 CreateObject・Pattern・IgnoreCase・Globalの設定方法

VBAでRegExpを使うには、まず「RegExpオブジェクト」を作成します。CreateObjectを使う方法と、参照設定を追加してDim宣言する方法の2通りがありますが、他のPCで動くマクロを配布する場合はCreateObject方式が安全です。

📚 用語解説

RegExpオブジェクト:VBAで正規表現を扱うためのオブジェクト。CreateObject("VBScript.RegExp")で生成します。主なプロパティはPattern(パターン文字列)・IgnoreCase(大文字小文字を無視)・Global(全マッチを取得)。主なメソッドはTest(マッチ判定)・Execute(マッチ結果取得)・Replace(置換)。

' ============================================================
' RegExpオブジェクトの作成(2つの方法)
' ============================================================

' 【方法1】CreateObject(参照設定不要・配布マクロに推奨)
Sub Method1_CreateObject()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")

    ' プロパティ設定
    re.Pattern = "\d+"         ' 1桁以上の数字にマッチするパターン
    re.IgnoreCase = True         ' 大文字・小文字を区別しない
    re.Global = True             ' 文字列中の全マッチを取得(False=最初の1件のみ)

    Dim result As Boolean
    result = re.Test("Hello 123 World")  ' → True(数字がある)
    MsgBox result  ' True

    Set re = Nothing  ' 明示的に解放
End Sub

' 【方法2】参照設定あり(早期バインディング・IntelliSense有効)
' ツール > 参照設定 > Microsoft VBScript Regular Expressions 5.5 にチェックを入れる
Sub Method2_EarlyBinding()
    Dim re As New RegExp  ' 参照設定が必要

    re.Pattern = "\d+"
    re.IgnoreCase = False
    re.Global = True

    MsgBox re.Test("abc 456 def")  ' True
    Set re = Nothing
End Sub
プロパティデフォルト値説明
PatternString""(空文字)マッチングに使う正規表現パターン文字列
IgnoreCaseBooleanFalseTrue=大文字・小文字を区別しない / False=区別する
GlobalBooleanFalseTrue=全マッチを取得 / False=最初のマッチのみ

📚 用語解説

Patternプロパティ:RegExpオブジェクトに設定する正規表現パターン文字列。VBAの文字列内では円記号(\)のエスケープが必要なため、\d(数字)は"\\d"と書きます。ただしVBAのStringでは単なる\は"\d"のように1つのバックスラッシュとして扱われます(C言語等の二重エスケープは不要)。実際のコードで\dと書くとPattern文字列は\dになります。

💡 VBAでのバックスラッシュの扱い

VBAの文字列リテラルでは、\(バックスラッシュ)は特別なエスケープ文字ではありません。そのため "\d" と書くとPattern文字列は \d(バックスラッシュ+d)になり、正規表現の「数字」メタ文字として正しく機能します。Pythonのように "\\"と2重に書く必要はありません。

' プロパティ設定の実例
Sub RegExpProperties()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")

    ' VBAでは "\d" でパターン文字列は \d(数字メタ文字)になる
    re.Pattern = "\d{3}-\d{4}"  ' パターン: 数字3桁-数字4桁(市外局番なし電話番号)
    re.IgnoreCase = False           ' 電話番号は大文字小文字の区別不要だが明示
    re.Global = True                ' 複数マッチを全て取得

    ' IgnoreCase の効果を確認
    re.Pattern = "[a-z]+"   ' 小文字アルファベット
    re.IgnoreCase = False
    MsgBox re.Test("HELLO")  ' False(大文字は一致しない)

    re.IgnoreCase = True
    MsgBox re.Test("HELLO")  ' True(大文字小文字を無視してa-zに一致)

    Set re = Nothing
End Sub
代表菅澤 代表菅澤
RegExpオブジェクトは1回だけ作成して使い回せます。プロシージャ冒頭でCreateObjectしてプロパティを設定し、複数回Test/Execute/Replaceを呼ぶのが効率的です。大量のセルを処理するループの中でCreateObjectを呼ぶとパフォーマンスが落ちるため、ループの外で1回だけ生成してください。

03 正規表現の主要メタ文字一覧 .・*・^・$・[]・+・?・{}・|・()の意味と使い方

正規表現の「メタ文字」は、特別な意味を持つ記号です。これらを組み合わせることで複雑なパターンを表現できます。VBA(VBScript RegExp)で使えるメタ文字を体系的に解説します。

📚 用語解説

メタ文字:正規表現の中で特別な意味を持つ記号の総称。.・*・+・?・^・$・[]・{}・|・()・\など。これらをそのままのリテラル文字として検索したい場合は、\(バックスラッシュ)でエスケープします(例:ピリオドを検索 → \. )。

3-1. 文字クラス・ショートハンド

メタ文字意味VBAでの記述
.(ドット)改行以外の任意の1文字".""a.c" → abc, aXc, a1c に一致
\d数字(0〜9)"\\d""\\d+" → 1, 23, 456 に一致
\D数字以外"\\D""\\D+" → abc, xyz に一致
\w英数字・アンダースコア"\\w""\\w+" → hello, abc_123 に一致
\W\w以外(記号・空白等)"\\W""\\W+" → @, !, スペース に一致
\s空白文字(スペース・タブ・改行)"\\s""\\s+" → 空白 に一致
\S空白以外"\\S""\\S+" → 非空白文字列に一致
[abc]a、b、cのいずれか1文字"[abc]""[aeiou]" → 母音に一致
[a-z]aからzの範囲の1文字"[a-z]""[a-zA-Z]" → 英字に一致
[^abc]a・b・c以外の1文字"[^abc]""[^0-9]" → 数字以外に一致

3-2. 量指定子(繰り返し)

メタ文字意味VBAでの記述
*0回以上の繰り返し"a*""ab*c" → ac, abc, abbc に一致
+1回以上の繰り返し"a+""\\d+" → 1, 12, 123(最低1桁)に一致
?0回または1回"a?""colou?r" → color, colour に一致
{n}ちょうどn回"a{3}""\\d{4}" → 4桁の数字に一致
{n,m}n回以上m回以下"a{2,4}""\\d{2,4}" → 2〜4桁の数字に一致
{n,}n回以上"a{2,}""\\d{3,}" → 3桁以上の数字に一致

3-3. アンカー・グループ・選択

メタ文字意味VBAでの記述
^文字列の先頭"^abc""^\\d" → 数字で始まる文字列に一致
$文字列の末尾"abc$""\\d$" → 数字で終わる文字列に一致
|選択(または)"a|b""cat|dog" → cat または dog に一致
()グループ化・キャプチャ"(ab)+""(\\d{3})-(\\d{4})" → 電話番号グループ化
\b単語境界"\\b""\\bword\\b" → 単語「word」に一致
' メタ文字の使い方サンプル
Sub MetaCharacterExamples()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")

    ' ドット(任意の1文字)
    re.Pattern = "a.c"
    MsgBox re.Test("abc")   ' True
    MsgBox re.Test("a1c")   ' True
    MsgBox re.Test("ac")    ' False(ドットは1文字必須)

    ' 量指定子
    re.Pattern = "\d{3}-\d{4}"  ' 電話番号(市外局番なし)
    MsgBox re.Test("090-1234")  ' True
    MsgBox re.Test("090-12")    ' False(4桁必要)

    ' アンカー
    re.Pattern = "^\d+"  ' 先頭が数字
    MsgBox re.Test("123abc")  ' True
    MsgBox re.Test("abc123")  ' False(先頭は英字)

    ' 文字クラス
    re.Pattern = "[a-zA-Z0-9]+"  ' 英数字のみ
    MsgBox re.Test("hello123")  ' True
    MsgBox re.Test("hello!@#")  ' True(英数字が1文字以上ある)

    ' 選択(OR)
    re.Pattern = "^(jpg|jpeg|png|gif)$"
    re.IgnoreCase = True
    MsgBox re.Test("JPG")   ' True(IgnoreCase=Trueのため)
    MsgBox re.Test("bmp")   ' False

    Set re = Nothing
End Sub
⚠️ エスケープが必要なメタ文字

正規表現の中でメタ文字そのもの(.・*・+・?・[・]・(・)・{・}・^・$・|・\)をリテラルとして検索したい場合は、前にバックスラッシュを付けてエスケープします。例:ピリオドを検索したい → Pattern = "\." / 括弧(を検索 → Pattern = "\(" / バックスラッシュを検索 → Pattern = "\\"(VBAでは"\\\\"と書く)。

Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

04 Testメソッドでマッチング確認(True/False判定) パターンに一致するかどうかをBoolean値で検証する

RegExpの「Testメソッド」は、指定した文字列がPatternに設定した正規表現と一致するかどうかをTrue/Falseで返します。「形式が正しいかどうかの検証(バリデーション)」に使います。Executeメソッドよりシンプルで高速なため、マッチ有無の確認だけが目的の場合はTestを使います。

📚 用語解説

Testメソッド:RegExpオブジェクトのメソッド。引数の文字列がPatternに一致すればTrue、一致しなければFalseを返します。構文:re.Test(文字列)。Globalプロパティの設定は結果に影響しません(Testは一致の有無だけを確認するため)。バリデーションや条件分岐に最適。Executeより軽量。

' Testメソッドの基本的な使い方
Sub TestMethodExamples()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")

    ' ===== 例1: メールアドレスの形式確認 =====
    re.Pattern = "^[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}$"
    re.IgnoreCase = True
    MsgBox re.Test("user@example.com")    ' True(正しい形式)
    MsgBox re.Test("user@example")        ' False(ドメイン末尾なし)
    MsgBox re.Test("@example.com")        ' False(ユーザー名なし)
    MsgBox re.Test("user@@example.com")   ' False(@が2つ)

    ' ===== 例2: 郵便番号の形式確認(NNN-NNNN形式)=====
    re.Pattern = "^\d{3}-\d{4}$"
    re.IgnoreCase = False
    MsgBox re.Test("100-0001")   ' True
    MsgBox re.Test("1000001")    ' False(ハイフンなし)
    MsgBox re.Test("100-00010")  ' False(数字が多い)

    ' ===== 例3: 日本語文字を含む確認 =====
    re.Pattern = "[\u3040-\u309F]"  ' ひらがな
    MsgBox re.Test("こんにちは")   ' True
    MsgBox re.Test("Hello")        ' False

    Set re = Nothing
End Sub

4-1. Testを使ったセル一括バリデーション

' シートのセル範囲に対してTestで一括バリデーション
Sub ValidateCellRange()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")

    ' 電話番号の形式チェック(市外局番込み: 0XX-XXXX-XXXX 形式)
    re.Pattern = "^0\d{1,4}-\d{1,4}-\d{4}$"
    re.Global = False

    Dim ws As Worksheet
    Set ws = ActiveSheet

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    Dim r As Long
    For r = 2 To lastRow
        Dim cellVal As String
        cellVal = Trim(CStr(ws.Cells(r, 1).Value))

        If re.Test(cellVal) Then
            ws.Cells(r, 2).Value = "OK"
            ws.Cells(r, 2).Interior.Color = RGB(198, 239, 206)  ' 薄緑
        Else
            ws.Cells(r, 2).Value = "NG(形式不正)"
            ws.Cells(r, 2).Interior.Color = RGB(255, 199, 206)  ' 薄赤
        End If
    Next r

    Set re = Nothing
    MsgBox "バリデーション完了(" & lastRow - 1 & "件処理)"
End Sub
AI鬼管理山崎 AI鬼管理山崎
Testで確認するパターンは「^(先頭)」と「$(末尾)」のアンカーを付けることが重要です。"\d{3}-\d{4}"というパターンは"あいう090-1234えお"という文字列にもTrueを返してしまいます。バリデーションでは必ず"^\d{3}-\d{4}$"と書いて「文字列全体がパターンに一致」することを確認します。

05 Executeメソッドでマッチング結果を取得 MatchesコレクションのFirstIndex・Length・Valueの使い方

RegExpの「Executeメソッド」は、パターンに一致した部分の詳細情報(マッチした文字列・位置・長さ)を含む「Matchesコレクション」を返します。「何がどこで一致したか」を取得したい場合に使います。Global=Trueにすれば、文字列中の全マッチを一括取得できます。

📚 用語解説

Matchesコレクション・Matchオブジェクト:Executeメソッドの戻り値。コレクションの各要素(Matchオブジェクト)は以下のプロパティを持ちます。Value:マッチした文字列 / FirstIndex:マッチ開始位置(0始まり) / Length:マッチした文字列の長さ。Matches.Count でマッチ件数を取得できます。

プロパティ説明例("hello 123 world 456"でPattern="\d+")
ValueStringマッチした文字列"123"(1件目)、"456"(2件目)
FirstIndexLongマッチ開始位置(0始まり)6(1件目)、14(2件目)
LengthLongマッチした文字列の長さ3("123"の長さ)
' Executeメソッドの基本的な使い方
Sub ExecuteMethodExamples()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")

    ' ===== 例1: 文字列中の全数字を取得 =====
    re.Pattern = "\d+"
    re.Global = True  ' 全マッチを取得

    Dim matches As Object
    Set matches = re.Execute("購入数: 123, 返品: 45, 在庫: 6789")

    MsgBox "マッチ件数: " & matches.Count  ' 3

    Dim i As Integer
    For i = 0 To matches.Count - 1
        Dim m As Object
        Set m = matches(i)
        MsgBox "Value=" & m.Value & _
               " FirstIndex=" & m.FirstIndex & _
               " Length=" & m.Length
        ' → Value=123 FirstIndex=5 Length=3
        ' → Value=45 FirstIndex=12 Length=2
        ' → Value=6789 FirstIndex=18 Length=4
    Next i

    Set re = Nothing
End Sub

5-1. Executeでセルから値を抽出してリストアップ

' シートのセルからパターンに一致する値を抽出してリストアップ
Sub ExtractMatchesToList()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")

    ' 電話番号のパターン(複数形式対応)
    re.Pattern = "0\d{1,4}-\d{1,4}-\d{4}"
    re.Global = True

    Dim wsSource As Worksheet
    Dim wsResult As Worksheet
    Set wsSource = ActiveSheet

    ' 結果出力シートの準備
    On Error Resume Next
    Set wsResult = ThisWorkbook.Sheets("抽出結果")
    On Error GoTo 0
    If wsResult Is Nothing Then
        Set wsResult = ThisWorkbook.Sheets.Add(After:=wsSource)
        wsResult.Name = "抽出結果"
    End If
    wsResult.Cells.Clear
    wsResult.Cells(1, 1).Value = "元セル"
    wsResult.Cells(1, 2).Value = "抽出値"
    wsResult.Cells(1, 3).Value = "開始位置"

    Dim outputRow As Long
    outputRow = 2

    Dim lastRow As Long
    lastRow = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row

    Dim r As Long
    For r = 2 To lastRow
        Dim cellText As String
        cellText = CStr(wsSource.Cells(r, 1).Value)

        Dim matches As Object
        Set matches = re.Execute(cellText)

        If matches.Count > 0 Then
            Dim m As Object
            For Each m In matches
                wsResult.Cells(outputRow, 1).Value = "A" & r  ' 元セル参照
                wsResult.Cells(outputRow, 2).Value = m.Value   ' 抽出した電話番号
                wsResult.Cells(outputRow, 3).Value = m.FirstIndex  ' 開始位置
                outputRow = outputRow + 1
            Next m
        End If
    Next r

    Set re = Nothing
    MsgBox "抽出完了: " & outputRow - 2 & "件を「抽出結果」シートに出力しました"
End Sub
代表菅澤 代表菅澤
Matchesコレクションのループでは「For i = 0 To matches.Count - 1」とインデックスを使う方法と「For Each m In matches」の2通りがあります。For Eachの方がシンプルですが、インデックスを使う方法はi番目のマッチを参照するなど細かい制御ができます。ケースに応じて使い分けてください。
💡 FirstIndexは0始まり(Mid関数と異なる)

Matchオブジェクトの FirstIndex は 0 から始まります(0始まりインデックス)。一方、VBAのMid関数の開始位置は1から始まります。FirstIndexを使ってMidで文字を取り出す場合は、Mid(str, m.FirstIndex + 1, m.Length) のように+1が必要です。

06 Replaceメソッドで文字列置換 パターンに一致した部分をまとめて別の文字列に置換する

RegExpの「Replaceメソッド」は、パターンに一致した部分を指定した文字列に置換します。VBA標準のReplace関数は「完全一致する固定文字列」しか置換できませんが、RegExpのReplaceはパターンで「どんな文字列も置換」できます。Global=Trueにすれば文字列中の全マッチを一括置換します。

' Replaceメソッドの基本的な使い方
Sub ReplaceMethodExamples()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")

    ' ===== 例1: 全ての数字を「X」に置換 =====
    re.Pattern = "\d"
    re.Global = True  ' 全マッチを置換

    Dim result As String
    result = re.Replace("電話: 03-1234-5678、FAX: 03-8765-4321", "X")
    MsgBox result  ' "電話: XX-XXXX-XXXX、FAX: XX-XXXX-XXXX"

    ' ===== 例2: 余分な空白を1つに圧縮 =====
    re.Pattern = "\s+"  ' 1つ以上の空白(スペース・タブ等)
    result = re.Replace("Hello   World  こんにちは", " ")
    MsgBox result  ' "Hello World こんにちは"

    ' ===== 例3: HTMLタグを除去 =====
    re.Pattern = "<[^>]+>"  ' <...> の形式
    result = re.Replace("<b>太字テキスト</b>と<span style='color:red'>赤文字</span>", "")
    MsgBox result  ' "太字テキストと赤文字"

    ' ===== 例4: 電話番号のハイフンを除去 =====
    re.Pattern = "-"
    result = re.Replace("090-1234-5678", "")
    MsgBox result  ' "09012345678"

    Set re = Nothing
End Sub

6-1. 後方参照($1・$2)を使った高度な置換

Replaceメソッドでは、パターン内のグループ((...)で囲んだ部分)を置換後の文字列に「$1」「$2」という後方参照で引用できます。これを使うと「マッチした部分の一部を保持しながら置換」ができます。

📚 用語解説

IgnoreCaseプロパティ:RegExpオブジェクトのプロパティ。Trueにすると正規表現マッチングで大文字・小文字を区別しません。デフォルトはFalse(区別する)。メールアドレス検証やURLマッチングなど「大文字小文字どちらでも同じ意味を持つ」場面でTrueに設定します。一方、コードや識別子の検証など大文字小文字が意味を持つ場面ではFalse(デフォルト)のままにします。

' 後方参照($1・$2)を使った置換
Sub ReplaceWithBackreference()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    re.Global = True

    ' ===== 例1: 日付形式を変換(YYYY/MM/DD → YYYY-MM-DD)=====
    re.Pattern = "(\d{4})/(\d{2})/(\d{2})"
    ' $1=年, $2=月, $3=日
    Dim result As String
    result = re.Replace("2026/07/19の会議と2026/08/01の締切", "$1-$2-$3")
    MsgBox result  ' "2026-07-19の会議と2026-08-01の締切"

    ' ===== 例2: 電話番号フォーマット統一(ハイフン形式に統一)=====
    ' 0X0XXXXXXXX(ハイフンなし)→ 0X0-XXXX-XXXX
    re.Pattern = "(0\d{2})(\d{4})(\d{4})"
    result = re.Replace("連絡先: 09012345678 / 08087654321", "$1-$2-$3")
    MsgBox result  ' "連絡先: 090-1234-5678 / 080-8765-4321"

    ' ===== 例3: 名前の前後の空白トリム =====
    re.Pattern = "^\s+|\s+$"  ' 先頭または末尾の空白
    result = re.Replace("   山田太郎   ", "")
    MsgBox result  ' "山田太郎"

    Set re = Nothing
End Sub
AI鬼管理山崎 AI鬼管理山崎
後方参照($1, $2...)は非常に強力です。「日付形式の変換」「電話番号の区切り方変更」「名前の姓・名の入れ替え」など、「元の文字を部分的に残しながら形式だけ変える」場面で活躍します。グループを複数作れば(最大9個)、複雑なフォーマット変換も1行のReplaceで実現できます。
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

07 実用パターン集(メール・電話・郵便番号・URL) 業務ですぐ使えるパターンをコード付きで完全収録

業務でよく必要になる「メールアドレス・電話番号・郵便番号・URL」の検証・抽出パターンを完全収録します。これらのパターンをそのままコピーして使ってください。

7-1. メールアドレスの検証・抽出

' メールアドレスの検証と抽出
Sub EmailPatterns()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    re.IgnoreCase = True

    ' ===== パターン1: メールアドレス検証(シンプル版)=====
    ' ユーザー名@ドメイン.TLD の形式
    re.Pattern = "^[\w.+-]+@[\w-]+(\.[\w-]+)*\.[a-z]{2,}$"
    re.Global = False

    MsgBox re.Test("user@example.com")         ' True
    MsgBox re.Test("user.name+tag@example.jp") ' True
    MsgBox re.Test("user@sub.example.co.jp")   ' True
    MsgBox re.Test("user@example")             ' False(TLDなし)
    MsgBox re.Test("@example.com")             ' False(ユーザー名なし)

    ' ===== パターン2: テキストからメールアドレスを全件抽出 =====
    re.Pattern = "[\w.+-]+@[\w-]+(\.[\w-]+)*\.[a-z]{2,}"
    re.Global = True

    Dim text As String
    text = "担当: yamada@example.com、サブ: sato@sub.example.co.jp まで連絡"

    Dim matches As Object
    Set matches = re.Execute(text)

    Dim emails As String
    emails = ""
    Dim m As Object
    For Each m In matches
        emails = emails & m.Value & vbCrLf
    Next m
    MsgBox "抽出されたメールアドレス:" & vbCrLf & emails

    Set re = Nothing
End Sub

7-2. 電話番号の検証・抽出・正規化

' 電話番号の検証・抽出・正規化
Sub PhonePatterns()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    re.Global = True

    ' ===== パターン1: 電話番号検証(固定・携帯・フリーダイヤル)=====
    ' 固定電話: 0X-XXXX-XXXX / 0XX-XXX-XXXX / 0XXX-XX-XXXX
    ' 携帯: 0X0-XXXX-XXXX
    ' フリーダイヤル: 0120-XXX-XXX / 0800-XXX-XXXX
    re.Pattern = "^(0\d{1,4}-\d{1,4}-\d{4}|0120-\d{3}-\d{3}|0800-\d{3}-\d{4})$"
    re.Global = False

    MsgBox re.Test("03-1234-5678")     ' True(東京固定)
    MsgBox re.Test("090-1234-5678")    ' True(携帯)
    MsgBox re.Test("0120-123-456")     ' True(フリーダイヤル)
    MsgBox re.Test("09012345678")      ' False(ハイフンなし)

    ' ===== パターン2: ハイフンありなし両対応で抽出 =====
    re.Pattern = "0\d{1,4}-?\d{1,4}-?\d{4}"
    re.Global = True

    Dim text As String
    text = "電話: 0312345678、FAX: 03-8765-4321、携帯: 09012345678"

    Dim matches As Object
    Set matches = re.Execute(text)
    Dim m As Object
    For Each m In matches
        MsgBox "電話番号発見: " & m.Value
    Next m

    ' ===== パターン3: ハイフンなしを統一フォーマットに変換 =====
    ' 携帯番号 3-4-4 形式に統一
    Dim re2 As Object
    Set re2 = CreateObject("VBScript.RegExp")
    re2.Pattern = "(0[789]0)(\d{4})(\d{4})"
    re2.Global = True

    Dim result As String
    result = re2.Replace("連絡先 09012345678 / 08087654321", "$1-$2-$3")
    MsgBox result  ' "連絡先 090-1234-5678 / 080-8765-4321"

    Set re = Nothing
    Set re2 = Nothing
End Sub

7-3. 郵便番号の検証・抽出

' 郵便番号の検証・抽出・フォーマット統一
Sub PostalCodePatterns()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")

    ' ===== パターン1: 郵便番号検証(〒NNN-NNNN / NNN-NNNN 両対応)=====
    re.Pattern = "^(〒|\u00a5)?\d{3}-\d{4}$"
    re.Global = False

    MsgBox re.Test("100-0001")   ' True
    MsgBox re.Test("〒100-0001") ' True
    MsgBox re.Test("1000001")    ' False(ハイフンなし)
    MsgBox re.Test("100-001")    ' False(桁数不足)

    ' ===== パターン2: テキストから郵便番号を抽出 =====
    re.Pattern = "(〒)?\d{3}-\d{4}"
    re.Global = True

    Dim matches As Object
    Set matches = re.Execute("〒100-0001 千代田区と〒530-0001 大阪市北区")

    Dim m As Object
    For Each m In matches
        MsgBox "郵便番号: " & m.Value
    Next m

    ' ===== パターン3: ハイフンなし7桁→ハイフンあり形式に変換 =====
    Dim re2 As Object
    Set re2 = CreateObject("VBScript.RegExp")
    re2.Pattern = "(\d{3})(\d{4})"
    re2.Global = True
    Dim result As String
    result = re2.Replace("1000001 5300001", "$1-$2")
    MsgBox result  ' "100-0001 530-0001"

    Set re = Nothing
    Set re2 = Nothing
End Sub

7-4. URLの検証・抽出

' URLの検証と抽出
Sub UrlPatterns()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    re.IgnoreCase = True

    ' ===== パターン1: URL検証(http/https) =====
    re.Pattern = "^https?://[\w\-\.]+\.[a-z]{2,}(/[\w\-\./\?=&%#]*)?$"
    re.Global = False

    MsgBox re.Test("https://www.example.com")            ' True
    MsgBox re.Test("http://sub.example.co.jp/path?q=1") ' True
    MsgBox re.Test("ftp://example.com")                  ' False(httpsのみ)
    MsgBox re.Test("www.example.com")                    ' False(スキームなし)

    ' ===== パターン2: テキスト中のURLを全件抽出 =====
    re.Pattern = "https?://[\w\-\.]+\.[a-z]{2,}(/[\w\-\./\?=&%#]*)?"
    re.Global = True

    Dim text As String
    text = "会社HP: https://genai-ai.co.jp/ / サービス: https://aikanri.genai-ai.co.jp/"

    Dim matches As Object
    Set matches = re.Execute(text)

    Dim m As Object
    For Each m In matches
        MsgBox "URL: " & m.Value
    Next m

    Set re = Nothing
End Sub
代表菅澤 代表菅澤
これらのパターンは「完璧な検証」ではなく「実務で十分に使える検証」です。RFC準拠の完全なメールアドレスパターンは非常に複雑になるため、実務では「@が1つある」「ドメイン末尾が2文字以上のアルファベット」程度のシンプルなパターンで十分なことがほとんどです。用途に合わせてパターンの厳密さを調整してください。

08 Globalプロパティと全マッチ処理 Global=True/Falseの違いと全マッチを処理するパターン

RegExpのGlobalプロパティは「文字列中の全マッチを対象にするかどうか」を制御します。Global=True(全マッチ)にするとExecuteは文字列中の全マッチを返し、Replaceは全マッチを置換します。Global=False(デフォルト)にすると最初のマッチのみが対象になります。

📚 用語解説

Globalプロパティ(全マッチ検索):RegExpオブジェクトのプロパティ。Trueにすると文字列全体を検索して全てのマッチを返します(ExecuteはMatchesコレクションに全件、Replaceは全マッチを置換)。Falseにすると最初のマッチのみを対象にします。Testメソッドはどちらでも動作は同じ(一致の有無だけ確認)。

メソッドGlobal=TrueGlobal=False
Test文字列中に1つでも一致があればTrue同左(Globalは影響しない)
Execute文字列中の全マッチを返す(Matches.Count >= 1)最初のマッチのみ返す(Matches.Count = 0 or 1)
Replace全マッチを置換最初のマッチのみ置換
' Global=True / False の違いを確認
Sub GlobalPropertyDemonstration()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "\d+"

    ' === Global=False(デフォルト)===
    re.Global = False
    Dim matchesFalse As Object
    Set matchesFalse = re.Execute("abc 123 def 456 ghi 789")
    MsgBox "Global=False: " & matchesFalse.Count & "件"  ' 1件("123"のみ)

    Dim resultFalse As String
    resultFalse = re.Replace("abc 123 def 456 ghi 789", "NUM")
    MsgBox "Global=False Replace: " & resultFalse  ' "abc NUM def 456 ghi 789"(最初だけ)

    ' === Global=True ===
    re.Global = True
    Dim matchesTrue As Object
    Set matchesTrue = re.Execute("abc 123 def 456 ghi 789")
    MsgBox "Global=True: " & matchesTrue.Count & "件"  ' 3件("123"・"456"・"789")

    Dim resultTrue As String
    resultTrue = re.Replace("abc 123 def 456 ghi 789", "NUM")
    MsgBox "Global=True Replace: " & resultTrue  ' "abc NUM def NUM ghi NUM"(全て)

    Set re = Nothing
End Sub

8-1. 全マッチを配列に収集する汎用関数

' 正規表現の全マッチを配列で返す汎用関数
Function RegExpExtractAll(text As String, pattern As String, _
                          Optional ignoreCase As Boolean = False) As Variant
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = pattern
    re.IgnoreCase = ignoreCase
    re.Global = True

    Dim matches As Object
    Set matches = re.Execute(text)

    If matches.Count = 0 Then
        RegExpExtractAll = Array()  ' 空配列
        Exit Function
    End If

    Dim results() As String
    ReDim results(0 To matches.Count - 1)

    Dim i As Integer
    For i = 0 To matches.Count - 1
        results(i) = matches(i).Value
    Next i

    RegExpExtractAll = results
    Set re = Nothing
End Function

' 使い方
Sub UseExtractAll()
    Dim text As String
    text = "会員番号: M-00123, M-00456, M-00789 の3名"

    Dim results As Variant
    results = RegExpExtractAll(text, "M-\d{5}")

    If UBound(results) >= 0 Then
        Dim i As Integer
        For i = 0 To UBound(results)
            MsgBox "会員番号 " & (i + 1) & ": " & results(i)
        Next i
    Else
        MsgBox "マッチなし"
    End If
End Sub
文字列入力
セル・変数
Global=True
設定

全マッチ対象
Execute
Matchesコレクション取得
For Eachループ
全Matchオブジェクト処理
Value/Index/Length
取得・処理

09 業務での実践パターン(バリデーション・不要文字除去) Excelデータ検証・一括クレンジング・データ正規化の実装例

9-1. 顧客データのバリデーション一括チェック

顧客リストのメールアドレス・電話番号・郵便番号を一括でバリデーションし、NG行に色付けして担当者に通知する実践パターンです。

' 顧客データのバリデーション一括チェック
Sub CustomerDataValidation()
    Dim ws As Worksheet
    Set ws = ActiveSheet

    ' バリデーション用RegExpを作成
    Dim reEmail As Object, rePhone As Object, rePostal As Object
    Set reEmail = CreateObject("VBScript.RegExp")
    Set rePhone = CreateObject("VBScript.RegExp")
    Set rePostal = CreateObject("VBScript.RegExp")

    reEmail.Pattern = "^[\w.+-]+@[\w-]+(\.[\w-]+)*\.[a-z]{2,}$"
    reEmail.IgnoreCase = True
    reEmail.Global = False

    rePhone.Pattern = "^0\d{1,4}-\d{1,4}-\d{4}$"
    rePhone.Global = False

    rePostal.Pattern = "^\d{3}-\d{4}$"
    rePostal.Global = False

    ' ヘッダー行の設定(A=氏名 B=メール C=電話 D=郵便番号 E=ステータス)
    ws.Cells(1, 5).Value = "検証結果"

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    Dim ngCount As Long
    ngCount = 0

    Dim r As Long
    For r = 2 To lastRow
        Dim errors As String
        errors = ""

        ' メールアドレスチェック
        Dim emailVal As String
        emailVal = Trim(CStr(ws.Cells(r, 2).Value))
        If emailVal <> "" And Not reEmail.Test(emailVal) Then
            errors = errors & "メール形式NG / "
        End If

        ' 電話番号チェック
        Dim phoneVal As String
        phoneVal = Trim(CStr(ws.Cells(r, 3).Value))
        If phoneVal <> "" And Not rePhone.Test(phoneVal) Then
            errors = errors & "電話形式NG / "
        End If

        ' 郵便番号チェック
        Dim postalVal As String
        postalVal = Trim(CStr(ws.Cells(r, 4).Value))
        If postalVal <> "" And Not rePostal.Test(postalVal) Then
            errors = errors & "郵便番号NG / "
        End If

        If errors <> "" Then
            ws.Cells(r, 5).Value = Left(errors, Len(errors) - 3)  ' 末尾の " / " を除去
            ws.Rows(r).Interior.Color = RGB(255, 235, 156)  ' 薄黄色でハイライト
            ngCount = ngCount + 1
        Else
            ws.Cells(r, 5).Value = "OK"
            ws.Cells(r, 5).Interior.Color = RGB(198, 239, 206)  ' 薄緑
        End If
    Next r

    Set reEmail = Nothing
    Set rePhone = Nothing
    Set rePostal = Nothing

    MsgBox "バリデーション完了" & vbCrLf & _
           "総件数: " & lastRow - 1 & "件" & vbCrLf & _
           "NGあり: " & ngCount & "件"
End Sub

9-2. 不要文字の一括除去・データクレンジング

' データクレンジング: 不要文字の一括除去
Sub DataCleansing()
    Dim ws As Worksheet
    Set ws = ActiveSheet

    Dim reSpaces As Object     ' 余分な空白
    Dim reSymbols As Object    ' 不要な記号
    Dim reZenNum As Object     ' 全角数字→半角変換(参考)

    Set reSpaces = CreateObject("VBScript.RegExp")
    Set reSymbols = CreateObject("VBScript.RegExp")

    ' 余分な空白(先頭・末尾・連続空白)
    reSpaces.Pattern = "^\s+|\s+$|\s{2,}"
    reSpaces.Global = True

    ' 不要な記号(括弧・スラッシュ・その他)
    reSymbols.Pattern = "[()()【】「」『』\[\]《》・]"
    reSymbols.Global = True

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    Dim r As Long
    For r = 2 To lastRow
        Dim original As String
        original = CStr(ws.Cells(r, 1).Value)

        ' Step1: 余分な空白を除去・圧縮
        Dim cleaned As String
        cleaned = reSpaces.Replace(original, " ")
        cleaned = Trim(cleaned)

        ' Step2: 不要記号を除去
        ' cleaned = reSymbols.Replace(cleaned, "")

        ws.Cells(r, 2).Value = cleaned  ' B列にクレンジング後の値を出力
    Next r

    Set reSpaces = Nothing
    Set reSymbols = Nothing
    MsgBox "クレンジング完了: " & lastRow - 1 & "件"
End Sub

9-3. セルから数値だけを抽出して合計する

' 「売上: 123,456円」のような文字列から数値のみ抽出して合計
Sub ExtractNumbersAndSum()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "[\d,]+"  ' 数字とカンマ
    re.Global = True

    Dim ws As Worksheet
    Set ws = ActiveSheet

    Dim total As Double
    total = 0

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    Dim r As Long
    For r = 2 To lastRow
        Dim cellText As String
        cellText = CStr(ws.Cells(r, 1).Value)

        Dim matches As Object
        Set matches = re.Execute(cellText)

        If matches.Count > 0 Then
            ' 最初にマッチした数値(カンマ除去して数値変換)
            Dim numStr As String
            numStr = matches(0).Value
            numStr = Replace(numStr, ",", "")  ' カンマ除去

            If IsNumeric(numStr) Then
                Dim num As Double
                num = CDbl(numStr)
                ws.Cells(r, 2).Value = num  ' B列に数値を出力
                total = total + num
            End If
        End If
    Next r

    ws.Cells(lastRow + 1, 2).Value = total
    ws.Cells(lastRow + 1, 1).Value = "合計"

    Set re = Nothing
    MsgBox "数値抽出完了。合計: " & Format(total, "#,##0") & "円"
End Sub
代表菅澤 代表菅澤
業務データのクレンジングで最も使うパターンは「先頭・末尾の空白除去」「連続空白の圧縮」「特定記号の一括除去」です。VBA標準のTrim関数は全角スペースを除去できませんが、正規表現の「\s」は全角スペースも含む空白文字を対象にできるため、より堅牢なトリムが実現できます。
生データ入力
空白・記号・混在
RegExp Pattern設定
除去対象を定義
Replace実行
全マッチを除去・変換
クレンジング済み
整形された文字列
DB・ファイルへ
後続処理に渡す

9-4. 住所の都道府県抽出

' 住所文字列から都道府県部分を抽出する
Function ExtractPrefecture(address As String) As String
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")

    ' 都道府県パターン(東京都/大阪府/京都府/北海道 + 残りの県)
    re.Pattern = "^(東京都|大阪府|京都府|北海道|\S+?[都道府県])"
    re.Global = False

    Dim matches As Object
    Set matches = re.Execute(address)

    If matches.Count > 0 Then
        ExtractPrefecture = matches(0).Value
    Else
        ExtractPrefecture = ""  ' 都道府県が判定できない場合
    End If

    Set re = Nothing
End Function

' 使い方
Sub TestExtractPrefecture()
    MsgBox ExtractPrefecture("東京都千代田区丸の内1-1-1")  ' "東京都"
    MsgBox ExtractPrefecture("大阪府大阪市北区梅田1-2-3")  ' "大阪府"
    MsgBox ExtractPrefecture("北海道札幌市中央区1条西1丁目")  ' "北海道"
    MsgBox ExtractPrefecture("神奈川県横浜市西区みなとみらい1-1")  ' "神奈川県"
    MsgBox ExtractPrefecture("埼玉県さいたま市大宮区123-4")  ' "埼玉県"
End Sub
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

10 Claude CodeとVBA正規表現の組み合わせ 正規表現パターンの生成・デバッグ・改善をAIに任せる方法

VBAの正規表現で最も難しいのは「パターン文字列の作成」です。「メールアドレスを検証するパターンを書いて」と言われても、どこまで厳密にすべきか、特殊ケースをどう扱うかの判断は経験が要ります。Claude Codeを使うと、「〇〇の形式を検証するVBA正規表現パターンを書いて」と依頼するだけで、すぐ使えるパターン文字列とVBAコードが生成されます。

✔️パターン生成依頼:「日本の携帯電話番号(080/090/070始まり、ハイフンあり/なし両対応)を検証するVBA正規表現を書いて」
✔️パターンの説明依頼:「"^[\w.+-]+@[\w-]+(\.[\w-]+)*\.[a-z]{2,}$"という正規表現の意味を説明して」
✔️エラーのデバッグ:「このパターンで"user@sub.example.co.jp"がFalseになる理由を教えて」
✔️業務要件からパターン化:「社員番号はアルファベット2文字+4桁の数字の形式。VBAのTestで検証するコードを書いて」
✔️既存コードの改善:「このRegExpコードでInStr+Mid+Replaceを多用しているところを正規表現で書き直して」
✔️パフォーマンス最適化:「10万行のループでRegExpを使っているが遅い。改善方法を提案して」
AI鬼管理山崎 AI鬼管理山崎
弊社では「この業務データのクレンジングパターンを正規表現で書いて」とサンプルデータをそのままClaude Codeに貼り付けて依頼しています。サンプルデータを見ながらパターンを生成してくれるため、抽象的な説明だけより精度の高いパターンが得られます。
' Claude Codeへの依頼例と典型的な回答パターン

' ===== 依頼例1 =====
' 「社員番号 AB-1234 形式(英大文字2文字+ハイフン+4桁数字)を検証して」

' Claude Codeが生成するコード例:
Function IsValidEmployeeId(empId As String) As Boolean
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "^[A-Z]{2}-\d{4}$"  ' 大文字2文字+ハイフン+4桁数字
    re.IgnoreCase = False              ' 大文字のみ受け付ける
    IsValidEmployeeId = re.Test(empId)
    Set re = Nothing
End Function

' 使い方
Sub TestEmployeeId()
    MsgBox IsValidEmployeeId("AB-1234")   ' True
    MsgBox IsValidEmployeeId("ab-1234")   ' False(小文字NG)
    MsgBox IsValidEmployeeId("ABC-1234")  ' False(3文字NG)
    MsgBox IsValidEmployeeId("AB-123")    ' False(3桁NG)
End Sub

' ===== 依頼例2 =====
' 「IPアドレス(IPv4)の形式を検証するVBAコードを書いて」

Function IsValidIPv4(ip As String) As Boolean
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    ' 0-255の数値が4組ドット区切り
    re.Pattern = "^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$"
    IsValidIPv4 = re.Test(ip)
    Set re = Nothing
End Function

Sub TestIPv4()
    MsgBox IsValidIPv4("192.168.1.1")    ' True
    MsgBox IsValidIPv4("255.255.255.0")  ' True
    MsgBox IsValidIPv4("256.0.0.1")      ' False(256は無効)
    MsgBox IsValidIPv4("192.168.1")      ' False(4オクテット必要)
End Sub
代表菅澤 代表菅澤
弊社のAI鬼管理では、VBAの業務マクロ作成・正規表現パターン設計・コードのリファクタリングをClaude Codeで自動化しています。「業務データのサンプルを貼り付けて、このデータから〇〇を抽出するVBAコードを書いて」と依頼するだけで、テスト済みのコードが数分で出来上がります。
業務要件・
サンプルデータ
Claude Codeに
依頼

パターン+コード生成
VBAコードに
貼り付け

動作確認
エッジケース確認
追加テスト・修正依頼
本番投入
業務マクロ完成

11 まとめ VBA正規表現の全体像と実装のポイント

この記事では、VBAの正規表現(RegExp)を完全に解説しました。RegExpオブジェクトの作成・プロパティ設定から、Test/Execute/Replace各メソッドの使い方、主要メタ文字一覧、メールアドレス・電話番号・郵便番号・URLの実用パターン、業務でのデータバリデーション・クレンジングの実践コードまで体系的に網羅しました。

✔️RegExpオブジェクトはCreateObjectで作成:参照設定不要で配布マクロにも安全
✔️3つのプロパティ:Pattern(パターン文字列)・IgnoreCase(大文字小文字)・Global(全マッチ)
✔️Testメソッド:パターンに一致するかTrue/Falseで検証。バリデーションに使う
✔️Executeメソッド:Matchesコレクションで全マッチのValue/FirstIndex/Lengthを取得
✔️Replaceメソッド:全マッチを一括置換。後方参照($1・$2)でフォーマット変換も可能
✔️実用パターン:メール/電話/郵便番号/URLの検証・抽出パターンをそのまま流用できる
✔️Claude Codeとの組み合わせ:要件を伝えるだけでパターン生成・デバッグが自動化できる
代表菅澤 代表菅澤
VBAの正規表現は「最初はとっつきにくい」ですが、いくつかの頻出パターン(\d・\w・\s・[...]・{n,m}・^・$)を覚えれば、業務データの検証・抽出・整形の場面で即使えます。まずはTestメソッドによるバリデーションから始めて、慣れてきたらExecuteとReplaceに応用してみてください。

VBA正規表現の設計から実装まで、Claude Codeで即解決

「メールアドレスを検証するパターンがわからない」「業務データのクレンジングを自動化したい」「RegExpを使った既存コードを改善したい」——弊社AI鬼管理では、Claude Codeを活用した業務VBAマクロの開発・自動化支援を提供しています。

AI鬼管理山崎 AI鬼管理山崎
正規表現パターンの設計から業務データのクレンジング自動化まで、Claude Codeなら要件を伝えるだけで実装できます。まずは無料相談で、現状の課題をお聞かせください。

NEXT STEP

この記事の内容を、あなたのビジネスで
実践してみませんか?

AI活用を自社で回せるようになりたい方へ

AI鬼管理

Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。

よくある質問

Q. VBAで正規表現を使うために参照設定は必要ですか?

A. CreateObject("VBScript.RegExp")を使う方法では参照設定は不要です。他のPCで動かす配布マクロにはこの方法を推奨します。開発中にIntelliSense(コード補完)を使いたい場合はVBEの「ツール > 参照設定」で「Microsoft VBScript Regular Expressions 5.5」にチェックを入れることでDim re As New RegExpの早期バインディングが使えます。

Q. PatternでVBA文字列のエスケープはどうすればいいですか?

A. VBAの文字列リテラルでは\(バックスラッシュ)は特別なエスケープ文字ではありません。そのため"\d"と書くとPattern文字列は\d(バックスラッシュ+d)になり、正規表現の「数字」メタ文字として機能します。Pythonやのような二重エスケープ("\\d")は不要です。ただしVBAの文字列リテラルでダブルクォートを使いたい場合は""と2つ続けて書きます。

Q. Global=TrueとGlobal=Falseの違いは何ですか?

A. Global=Trueにすると文字列中の全マッチを対象にします(Executeは全件返し、Replaceは全件置換)。Global=Falseは最初のマッチのみを対象にします。バリデーション(一致の有無だけ確認)の場合はTestメソッドを使いGlobalは影響しません。文字列から値を全件抽出・全件置換する場合はGlobal=Trueが必要です。

Q. IgnoreCase=Trueにしても日本語の大文字小文字に効果はありますか?

A. IgnoreCaseは英字(A-Z/a-z)の大文字・小文字を区別しないかどうかを制御します。日本語(ひらがな・カタカナ・漢字)には直接的な効果はありません。カタカナとひらがなを同一視したい場合は正規表現では対応できないため、StrConv関数(StrConv(text, vbKatakana)等)で事前に統一してからマッチングする必要があります。

Q. MatchオブジェクトのFirstIndexは何番から始まりますか?

A. 0から始まります(0ベースインデックス)。一方VBAのMid関数は1から始まります。FirstIndexを使ってMidで文字を切り出す場合はMid(str, m.FirstIndex + 1, m.Length)と+1が必要です。この違いでバグが起きやすいので注意してください。

Q. 正規表現で日本語文字(ひらがな・カタカナ・漢字)はマッチできますか?

A. Unicodeの範囲指定で可能です。ひらがな: [\u3040-\u309F] / カタカナ: [\u30A0-\u30FF] / 漢字(一般的な範囲): [\u4E00-\u9FFF]。ただしVBScript RegExpのUnicodeエスケープ(\uXXXX)のサポートは実装によって異なるため、動作確認が必要です。実用上は「\S+」(非空白文字)で日本語文字を含む多くのケースに対応できます。

Q. RegExpのパフォーマンスを改善するコツは何ですか?

A. ループの中でCreateObjectを毎回呼ばず、ループの外で1回だけ作成して使い回してください。また複雑すぎるパターンよりシンプルなパターンの方が高速です。10万行以上の大量データを処理する場合は、Application.ScreenUpdating=FalseとApplication.Calculation=xlCalculationManualで画面更新と計算を停止してから処理すると大幅に速くなります。

AIAI鬼管理

AI鬼管理へのお問い合わせ

この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。

会社名を入力してください
業種を選択してください
お名前を入力してください
正しいメールアドレスを入力してください

1つ以上選択してください
1つ以上選択してください
月額コストを選択してください

約1時間のオンライン面談(Google Meet)です

空き枠を取得中...
面談日時を選択してください

予約確定後、Google Calendarの招待メールをお届けします。
しつこい営業は一切ございません。

監修 最終更新日: 2026年7月19日
菅澤孝平
菅澤 孝平 株式会社GENAI 代表取締役
  • AI業務自動化サービス「AI鬼管理」を運営 — Claude Code を活用し、経営者の業務を「AIエージェントに任せる仕組み」へ転換するパーソナルトレーニングを 伴走構築 で提供。日報・採用・問い合わせ対応・経費精算・議事録・データ集計・営業リスト等の定型業務を、AIに代行させる体制を経営者と一緒に作り込む
  • Claude Code 実装ノウハウを 経営者・法人クライアント に直接指導。生成AIを「便利ツール」ではなく 「業務を任せる存在」 として運用する手法を体系化
  • 「やらせ切る管理」メソッドの開発者。シンゲキ株式会社(2021年設立・鬼管理専門塾運営)にて累計3,000名以上の学習者を志望校合格に導いた管理メソッドを、AI × 経営者支援 に転用
  • 著書『3カ月で志望大学に合格できる鬼管理』(幻冬舎)、『親の過干渉こそ、最強の大学受験対策である。』(講談社)
  • メディア出演: REAL VALUE / カンニング竹山のイチバン研究所 / ええじゃないかBiz 他
  • 明治大学政治経済学部卒
現在は AI鬼管理(Claude Code活用の伴走型パーソナルトレーニング)を主事業とし、経営者と二人三脚で「AIに業務を任せる仕組み」を実装。「実行を強制する環境」を AI で構築する手法を、自社の実運用知見をもとに発信している。