【2026年7月最新】VBAの正規表現(RegExp)完全ガイド|文字列抽出・置換・マッチングをコード例付きで解説
この記事の内容
「メールアドレスが正しい形式かどうかをVBAで検証したい」「電話番号や郵便番号をセルから一括抽出したい」「特定のパターンに一致する文字列を全件置換したい」——こうした要件に最も強力な手段が「VBAの正規表現(RegExp)」です。Excelの関数だけでは手が届かない、複雑な文字列処理を1本のパターン文字列で実現できます。
この記事では、VBAでの正規表現の使い方を完全に解説します。RegExpオブジェクトの作成・基本設定(Pattern・IgnoreCase・Global)から、Test/Execute/Replace各メソッドの使い方、メタ文字一覧、メールアドレス・電話番号・URLの実用パターン、業務での活用例まで、コード例を豊富に交えて説明します。
01 WHAT IS REGEXP 正規表現とは何か・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桁の数字」など範囲指定が簡潔 |
セル・変数・ファイル内容
Pattern設定
/ Replace
3つのメソッド
True/False・Matches・置換文字列
バリデーション・抽出・整形
02 REGEXP OBJECT 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
| プロパティ | 型 | デフォルト値 | 説明 |
|---|---|---|---|
| Pattern | String | ""(空文字) | マッチングに使う正規表現パターン文字列 |
| IgnoreCase | Boolean | False | True=大文字・小文字を区別しない / False=区別する |
| Global | Boolean | False | True=全マッチを取得 / False=最初のマッチのみ |
📚 用語解説
Patternプロパティ:RegExpオブジェクトに設定する正規表現パターン文字列。VBAの文字列内では円記号(\)のエスケープが必要なため、\d(数字)は"\\d"と書きます。ただしVBAのStringでは単なる\は"\d"のように1つのバックスラッシュとして扱われます(C言語等の二重エスケープは不要)。実際のコードで\dと書くとPattern文字列は\dになります。
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
03 METACHARACTERS 正規表現の主要メタ文字一覧 .・*・^・$・[]・+・?・{}・|・()の意味と使い方
正規表現の「メタ文字」は、特別な意味を持つ記号です。これらを組み合わせることで複雑なパターンを表現できます。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では"\\\\"と書く)。
04 TEST METHOD 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
05 EXECUTE METHOD 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+") |
|---|---|---|---|
| Value | String | マッチした文字列 | "123"(1件目)、"456"(2件目) |
| FirstIndex | Long | マッチ開始位置(0始まり) | 6(1件目)、14(2件目) |
| Length | Long | マッチした文字列の長さ | 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
Matchオブジェクトの FirstIndex は 0 から始まります(0始まりインデックス)。一方、VBAのMid関数の開始位置は1から始まります。FirstIndexを使ってMidで文字を取り出す場合は、Mid(str, m.FirstIndex + 1, m.Length) のように+1が必要です。
06 REPLACE METHOD 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
07 PRACTICAL PATTERNS 実用パターン集(メール・電話・郵便番号・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
08 GLOBAL PROPERTY Globalプロパティと全マッチ処理 Global=True/Falseの違いと全マッチを処理するパターン
RegExpのGlobalプロパティは「文字列中の全マッチを対象にするかどうか」を制御します。Global=True(全マッチ)にするとExecuteは文字列中の全マッチを返し、Replaceは全マッチを置換します。Global=False(デフォルト)にすると最初のマッチのみが対象になります。
📚 用語解説
Globalプロパティ(全マッチ検索):RegExpオブジェクトのプロパティ。Trueにすると文字列全体を検索して全てのマッチを返します(ExecuteはMatchesコレクションに全件、Replaceは全マッチを置換)。Falseにすると最初のマッチのみを対象にします。Testメソッドはどちらでも動作は同じ(一致の有無だけ確認)。
| メソッド | Global=True | Global=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
セル・変数
設定
全マッチ対象
Matchesコレクション取得
全Matchオブジェクト処理
取得・処理
09 BUSINESS USE CASES 業務での実践パターン(バリデーション・不要文字除去) 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
空白・記号・混在
除去対象を定義
全マッチを除去・変換
整形された文字列
後続処理に渡す
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
10 CLAUDE CODE Claude CodeとVBA正規表現の組み合わせ 正規表現パターンの生成・デバッグ・改善をAIに任せる方法
VBAの正規表現で最も難しいのは「パターン文字列の作成」です。「メールアドレスを検証するパターンを書いて」と言われても、どこまで厳密にすべきか、特殊ケースをどう扱うかの判断は経験が要ります。Claude Codeを使うと、「〇〇の形式を検証するVBA正規表現パターンを書いて」と依頼するだけで、すぐ使えるパターン文字列とVBAコードが生成されます。
' 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
サンプルデータ
依頼
パターン+コード生成
貼り付け
動作確認
追加テスト・修正依頼
業務マクロ完成
11 CONCLUSION まとめ VBA正規表現の全体像と実装のポイント
この記事では、VBAの正規表現(RegExp)を完全に解説しました。RegExpオブジェクトの作成・プロパティ設定から、Test/Execute/Replace各メソッドの使い方、主要メタ文字一覧、メールアドレス・電話番号・郵便番号・URLの実用パターン、業務でのデータバリデーション・クレンジングの実践コードまで体系的に網羅しました。
VBA正規表現の設計から実装まで、Claude Codeで即解決
「メールアドレスを検証するパターンがわからない」「業務データのクレンジングを自動化したい」「RegExpを使った既存コードを改善したい」——弊社AI鬼管理では、Claude Codeを活用した業務VBAマクロの開発・自動化支援を提供しています。
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で画面更新と計算を停止してから処理すると大幅に速くなります。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。




