未分類

VBA × 正規表現(RegExp)完全ガイド|設定・書き方・よくあるミスの防ぎ方

k.w
\お買い物マラソン開催中/

正規表現は、文字列から特定パターンを「見つける・取り出す・置き換える」ための強力な仕組みです。VBAでは RegExp オブジェクトを使って、複雑な文字列処理をシンプルな記述で実現できます。ここでは実務で使える前提知識から、プロパティ/メソッド、具体例までを一気に整理します。

VBScript 廃止に伴う対応ポイント(VBAの組み込みRegExpの活用)

  • Windows環境ではVBScriptが段階的に無効化へ。影響を受けやすいのは「.vbs の呼び出し」や「VBScript.RegExp 参照」。
  • Office 365 バージョン 2508 以降は、VBA側に正規表現クラスが標準搭載され、VBScriptに依存せずに利用可能。
  • 推奨アクション:
    • Officeを最新状態に更新する。
    • 外部参照を避け、VBA標準のRegExpを使う方針に切り替える。
    • VBScriptを無効化した環境でも動作確認を行い、互換性を担保する。

メタ文字

メタ文字とは「特別な意味」を持つ記号のことです。文字の場所・種類・繰り返し回数・まとまり(グループ)などを表現し、複雑な条件を短く記述できます。

正規表現

カテゴリシンボル説明
位置指定^文字列の先頭にマッチ
位置指定$文字列の末尾にマッチ
位置指定\b単語境界にマッチ
位置指定\B単語境界以外の位置にマッチ
リテラル\n \f \r \t \v改行、改ページ、復帰、タブ、縦タブにそれぞれ一致
リテラル\? * + . | { } \ [ \ ] ( )各記号そのものに一致
リテラル\xxx / \xdd / \uxxxx8進/16進/Unicodeで指定した文字に一致
文字クラス[xyz]x,y,z のいずれか1文字に一致
文字クラス[^xyz]x,y,z 以外の1文字に一致
文字クラス.改行以外の任意1文字に一致
文字クラス\w / \W英数+アンダーバー/その以外に一致
文字クラス\d / \D数字/数字以外に一致
文字クラス\s / \S空白(空白・タブ・改行など)/非空白に一致
繰り返し{x}直前要素をちょうど x 回
繰り返し{x,}直前要素を x 回以上
繰り返し{x,y}直前要素を x~y 回
繰り返し?直前要素を 0 または 1 回({0,1})
繰り返し*直前要素を 0 回以上({0,})
繰り返し+直前要素を 1 回以上({1,})
グループ化( )式をひとまとまりにする(入れ子可)
選択|いずれかの式に一致
後方参照() と \nn番目のグループに再一致

正規表現RegExpの使い方

VBAで正規表現を使う場合は、RegExpオブジェクトを生成し、Pattern / IgnoreCase / Global を設定してから、Test / Execute / Replace を呼び出します。

RegExpオブジェクト

プロパティ概要
Pattern検索パターンを指定
IgnoreCase大小文字を区別しない場合は True(既定 False)
Global文字列全体で繰り返し検索する場合は True(既定 False)
メソッド説明
Test(string)一致があれば True、なければ False を返す
Replace(string, repl)一致部分を置換文字で差し替える
Execute(string)一致した要素の集合(Matches)を返す

RegExpの使用例

用途パターン対象判定
郵便番号\d{3}-\d{4}101不一致
郵便番号\d{3}-\d{4}101-101不一致
郵便番号\d{3}-\d{4}101-0011一致
メール[\w.-]+@[\w-]+.[\w.-]+abc.def不一致
メール[\w.-]+@[\w-]+.[\w.-]+abc@def不一致
メール[\w.-]+@[\w-]+.[\w.-]+abc@def.com一致
コード(一致判定サンプル)
1Sub SampleMatchTest()
2Dim i As Long
3Dim re As New RegExp
4For i = 2 To 7
5With re
6.Global = True ‘全体から検索
7.IgnoreCase = True ‘大文字小文字を無視
8.Pattern = Cells(i, 2).Value
9Cells(i, 4).Value = IIf(.Test(Cells(i, 3).Value), “OK”, “NG”)
10End With
11Next i
12End Sub

Matchesコレクション

プロパティ内容
Count一致要素(Match)の個数(読み取り専用)
Item指定インデックスのMatchを取得(読み取り専用)

Matchオブジェクト

プロパティ内容
FirstIndex元文字列における一致開始位置(0始まり、読み取り専用)
Length一致文字列の長さ(読み取り専用)
Value一致した文字列そのもの(既定値、読み取り専用)

SubMatchesコレクション

グループ化した括弧内 ( ) に対応する「部分一致」の集合。Match.SubMatches(index) で参照できます。

Execute(Matches / Match / SubMatches)の使用例

文字列を英字ブロックと数字ブロックに分割

コード
1Sub SampleSplitAlphaNum()
2Dim re As New RegExp, mc As MatchCollection, m As Match, i As Long
3re.Pattern = “(\D+)(\d+)”
4re.Global = True
5Set mc = re.Execute(“Abc123DEFGH4567ijkl890”)
6For Each m In mc
7For i = 0 To m.SubMatches.Count – 1
8Debug.Print m.SubMatches(i)
9Next i
10Next m
11End Sub

Replaceの使用例

数字以外をすべて削除する

コード
1Sub SampleKeepDigits()
2Dim re As New RegExp
3re.Pattern = “\D”
4re.Global = True
5MsgBox re.Replace(“Abc123DEFGH4567ijkl890”, “”)
6End Sub

$番号のキャプチャで先頭の英字のみ抽出

コード
1Sub SampleCaptureGroup()
2Dim re As New RegExp
3re.Pattern = “([A-ZA-Z]+)([0-9]+)”
4re.Global = True: re.IgnoreCase = True
5MsgBox re.Replace(“Abc123あいう4567def890”, “$1”)
6End Sub

先読み:肯定先読み/否定先読み

コード(肯定先読み:アンダースコア直前の連続文字)
1Sub SampleLookaheadPositive()
2Dim re As New RegExp, mc As MatchCollection, m As Match
3re.Global = True
4re.Pattern = “([^]+(?=))”
5Set mc = re.Execute(“abc_def_ghi”)
6For Each m In mc: Debug.Print m.Value: Next m
7End Sub
コード(否定先読み:直後が数字でない a?c)
1Sub SampleLookaheadNegative()
2Dim re As New RegExp, mc As MatchCollection, m As Match
3re.Pattern = “(a.c(?!\d))”
4re.Global = True
5Set mc = re.Execute(“abc1acc_adc”)
6For Each m In mc: Debug.Print m.Value: Next m
7End Sub

正規表現の実践例

  • 入力検証:郵便番号・電話番号・メールなどのフォーマットチェックに。
  • データ整形:余分なスペースや記号の除去、半角/全角の抽出と置換。
  • ログ解析:特定パターン(日時・IP・ステータス)の抽出や集計の前処理に。
  • 抽出と分割:商品コード・枝番・サフィックスをグループ化して切り出し。
  • 置換テンプレ:キャプチャした部分を $1, $2 で再配置して表記ゆれを統一。

正規表現は短い式で強力に動く一方、可読性を損ないやすい側面もあります。パターンは小さく検証しながら育て、コメントとテストデータを必ず残す——これが実務での失敗を減らすコツです。

ABOUT ME
記事URLをコピーしました