VBA技術解説
VBAで正規表現を利用する(RegExp)

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2013-06-26 最終更新日:2025-09-15

VBAで正規表現を利用する(RegExp)


正規表現は複雑なパターンマッチングとテキストの検索置換するためのツールです、
マクロVBAで正規表現を使う場合はRegExpオブジェクトを使用します、
RegExpは、VBScriptに正規表現として用意されているオブジェクトです。


VBScript 廃止に向けて、VBA プロジェクトを対応させる方法

2024年5月、MicrosoftはWindowsにおけるVBScriptの段階的な廃止を発表しました。
詳細はWindows IT Pro公式ブログに掲載されています。この変更は、特に正規表現などの参照ライブラリでVBScriptを使用しているVBA開発者に影響を及ぼします。
この記事では、今後の変更点の概要と、VBAプロジェクトの将来的な安全性確保に役立つガイダンスを提供します。

  • Windows で VBScript が段階的に廃止されます。
  • VBA プロジェクトで影響するのは主に
    • .vbs スクリプトの呼び出し
    • VBScript.RegExp など VBScript ライブラリの参照。
  • Office 365 バージョン 2508 以降では、VBA に 組込み RegExp クラスが追加され、VBScript なしで正規表現が使える。
  • 対応策は以下の3つ:
    • Office を最新化
    • VBA 標準の RegExp を利用(外部参照は避ける)
    • VBScript 無効環境でテストして問題がないか確認。

2025年8月27日
VBAで正規表現を利用する(RegExp)
筆者が手元で現象確認できたのは、2025年9月2日でした。
■判明したこと
Excel365のバージョン2058の環境で発生します。
当初は、CreateObject("VBScript.RegExp")これで遅延バインディングした時のReplaceメソッドでエラーが発生していました。
ですが、その後に修正が施されたようで、このエラーは解消されました。
そして、VBAにRegExpクラスが追加されたことにより、参照設定「Microsoft Scripting Runtime」も必要なくなりました。
Dim 変数 As New RegExp
これが参照設定なしで記述できるようになりました。
ただし、他のExcelバージョンでは使えませんので、配布する場合は参照設定するか、CreateObjectの実行時バインディングで記述してください。


目次

メタ文字

メタ文字の一覧です。正規表現でこれらの文字自身をマッチングしたい場合は、手前に「\」を付けてください。
^ $ ? * + . | { } \ [ ] ( )


正規表現

シンボル 機能
位置マッチング
^ 文字列の先頭にのみマッチします。
$ 文字列の末尾にのみマッチします。
\b 任意の単語境界にマッチします。
\B 任意の単語境界以外の位置にマッチします。
リテラル
英数字 英字と数字に文字どおりにマッチします。
\n 改行にマッチします。
\f フォーム フィードにマッチします。
\r キャリッジ リターンにマッチします。
\t 水平タブにマッチします。
\v 垂直タブにマッチします。
\? ? にマッチします。
\* * にマッチします。
\+ + にマッチします。
\. . にマッチします。
\| | にマッチします。
\{ { にマッチします。
\} } にマッチします。
\\ \ にマッチします。
\[ [ にマッチします。
\] ] にマッチします。
\( ( にマッチします。
\) ) にマッチします。
\xxx 8進数 xxx によって表現されるASCII文字にマッチします。
\xdd 16進数 dd によって表現されるASCII文字にマッチします。
\uxxxx UNICODE xxxx によって表現されるASCII文字にマッチします。
文字クラス
[xyz] 文字セットに含まれている任意の1文字にマッチします。
[^xyz] [^xyz] 文字セットに含まれていない任意の1文字にマッチします。
. \n 以外の任意の文字にマッチします。
\w 単語に使用される任意の文字にマッチします。[a-zA-Z_0-9]と等価。
\W 単語に使用される文字以外の任意の文字にマッチします。[^a-zA-Z_0-9]と等価。
\d 任意の数字にマッチします。[0-9]と等価。
\D 任意の数字以外の文字にマッチします。[^0-9]と等価。
\s 任意のスペース文字にマッチします。[ \t\r\n\v\f]と等価。
\S 任意の非スペース文字にマッチします。[^ \t\r\n\v\f]と等価。
繰り返し
{x} 正規表現のちょうど x個の直前の文字にマッチします。
{x,} 正規表現のx個以上の直前の文字にマッチします。
{x,y} 正規表現のx個以上、y個以下の直前の文字にマッチします。
? ゼロ個または1個の直前の文字にマッチします。{0,1}と等価。
* ゼロ個以上の直前の文字にマッチします。{0,}と等価。
+ 1個以上の直前の文字にマッチします。{1,}と等価。
選択とグループ化
() 複数の句をグループ化して、1つの句を作成します。ネストすることができます。 "(ab)?(c)" は "abc" または "c" にマッチします。
| 選択は、複数の句を1つの正規表現にまとめ、これらのうちの任意の句にマッチします。
後方参照
()\n n番目の括弧で囲まれた句にマッチします。


正規表現RegExpの使い方

事前バインディング
Microsoft VBScript Regular Expressions 5.5
(バージョンは環境によります、1.0もありますが機能が違います。)
これを参照設定し、
Dim 変数 As New RegExp
遅延バインディング
Dim 変数 As Object
Set 変数 = CreateObject("VBScript.RegExp")


RegExpオブジェクト

プロパティ 説明
Pattern 検索するパターンを設定する
IgnoreCase 検索するときに大文字と小文字を区別する(既定値:False)か、区別しない(True)かを設定する
Global 検索文字列全体について検索する(True)か、最初の一致を検索する(既定値:False)のかを設定する

メソッド 説明
Test object.Test(string)
パターンに一致する文字列が検索されたらTrueを返します。
見つからないとFalseを返します。
Replace object.Replace(string1, string2)
検索されたら置換文字列(string2)と置き換えます
Execute object.Execute(string)
指定された文字列を正規表現で検索します
文字列内で見つかった文字列ごとに存在するMatchオブジェクトを含む、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
※A1セルから配置されているものとします。

上記表の対象文字の妥当性を判定し、結果に"OK"、"NG"を表示します。

Sub sample1()
  Dim i As Long
  Dim re As New RegExp
  Dim strIn As String
  
  For i = 2 To 7
    With re
      .Global = True     '文字列全体を検索
      .IgnoreCase = True   '大文字小文字を区別しない
      .Pattern = Cells(i, 2)
      If .test(Cells(i, 3)) Then
        Cells(i, 4) = "OK"
      Else
        Cells(i, 4) = "NG"
      End If
    End With
  Next
End Sub


RegExp関連のオブジェクト

Matchesコレクション

Matchesコレクションには、個別のMatchオブジェクトが格納されます。
このコレクションは、RegExpブジェクトのExecuteメソッドによってのみ作成可能です。
個別の Match オブジェクトのプロパティと同様、Matchesコレクションのプロパティは読み取り専用です。

プロパティ 説明
Count Count - コレクション内の Match オブジェクトの数を含んでいる読み取り専用の値。
Item Item - Matches コレクション オブジェクトから Match オブジェクトにランダムにアクセスできるようにする読み取り専用の値。

Matchオブジェクト

Matchオブジェクトは、RegExp オブジェクトのExecuteメソッドによってのみ作成が可能です。
このメソッドが実際に返すのは、Matchオブジェクトのコレクションです。
Matchオブジェクトのプロパティは、すべて読み取り専用です。

プロパティ 説明
FirstIndex FirstIndex - 元の文字列内のマッチが起こった位置を含んでいる読み取り専用の値。
このインデックスは位置の記録に 基点を 0 とするオフセットを使用しており、文字列の最初の位置は 0 から始まります。
Length Length - マッチした文字列の合計の長さを含んでいる読み取り専用の値。
Value Value - マッチした値またはテキストを含んでいる読み取り専用の値。
これはまた、Match オブジェクトにアクセスするときの既定値でもあります。

SubMatchesコレクション

SubMatchesコレクションには、個別のサブマッチ文字列が格納されます。
このコレクションは、RegExpオブジェクトの Executeメソッドによってのみ作成可能です。
SubMatchesコレクションのプロパティ(Count,Item)は、すべて読み取り専用です。


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

文字列をアルファベットと数値に分割

Sub sample2()
  Dim re As New RegExp
  Dim mc As MatchCollection
  Dim m As Match
  Dim i As Long
  re.Pattern = "(\D+)(\d+)"
  re.Global = True
  Set mc = re.Execute("Abc123DEFGH4567ijkl890")
  For Each m In mc
    For i = 0 To m.SubMatches.Count - 1
      MsgBox m.SubMatches(i)
    Next
  Next
End Sub

上記では、文字列をアルファベットと数値に分割して、順次メッセージボックスに表示しています。


Replaceの使用例

文字列から数値以外を消去

Sub sample3()
  Dim re As New RegExp
  re.Pattern = "\D"
  re.Global = True
  MsgBox re.Replace("Abc123DEFGH4567ijkl890", "")
End Sub

とても簡単な例ですが、簡単であるからこそ、正規表現の便利さが実感できると思います。

$numberのキャプチャグループ

大文字小文字を区別せずに、アルファベット+数値の場合のみ数値を消しています。

Sub sample4()
  Dim re As New RegExp
  re.Pattern = "([A-ZA-Z]+)([0-9]+)"
  re.Global = True
  re.IgnoreCase = True
  MsgBox re.Replace("Abc123あいう4567def890", "$1")
End Sub

$numberを使う事で、キャプチャグループに一致する部分文字列を置換文字列に含めることが出来ます。
上記の場合、キャプチャグループは、([A-ZA-Z]+)と([0-9]+)の2つになります。
([A-ZA-Z]+)が$1、([0-9]+)が$2
$1$2を$1に置換することでアルファベット+数値の数値部分を消しています。


先読み:肯定先読み、否定先読み

正規表現を極めようとするとかなり大変ですし、それらは専門のサイトをご利用ください。
VBAでは筆者が確認できる範囲では一般的に言われる後読みに(<=)は対応していません。
ごく簡単な使用例で説明します。

  Dim re As New RegExp
  Dim mc As MatchCollection
  Dim m As Match
  re.Global = True
  
  re.Pattern = "([^_]+(?=_))"
  Set mc = re.Execute("abc_def_ghi")
  For Each m In mc
    MsgBox m.Value
  Next

これは、
abc
def
とと出力されます。

○(?=△)
これで、後に△のある○とマッチします。
上の例では、
[^_]
これは_以外の文字、
[^_]+(?=_)
これで、後が"_"である"abc"と"def"がマッチします。

?=
これを
?:
このように:にすると、後ろの文字も含んだ文字列が取得されます。
したがって、
abc_
def_
と出力されます。

以上が肯定先読みになります。
否定先読みもあります。

Sub sample()
  Dim re As New RegExp
  Dim mc As MatchCollection
  Dim m As Match
  re.Global = True
  
  re.Pattern = "(a.c(?!\d))"
  re.Global = True
  Set mc = re.Execute("abc1acc_adc")
  For Each m In mc
    MsgBox m.Value
  Next
End Sub

○(?!△)
これで、後が△ではない○とマッチします。
上の結果は、
acc
adc
このようになります。
?!\dなので、後ろが数値以外とマッチします。
つまり、後ろが数値のabcは対象外となります。


正規表現の実践例

greeenはgreenに、greeeeeNをGReeeeNに変換
・問題を出したツイート ・お寄せいただいた回答ツイート ・用意した解答
数式の関数の使用回数、関数名を配列で返す
ツイッターで出したエクセルVBAのお題です。セルに入っている計算式に使われている関数(ユーザー定義含む)を数えてみましょう、というお題になります。問題を出したツイート 【VBAお題】セルに計算式が入っています。
VBA100本ノック 16本目:無駄な改行を削除
・出題 ・頂いた回答 ・解説 ・補足 ・サイト内関連ページ
VBA100本ノック 24本目:全角英数のみ半角
・出題 ・頂いた回答 ・解説 ・補足 ・サイト内関連ページ
VBA100本ノック 72本目:ITをDXに変換(文字列操作)
・出題 ・頂いた回答 ・解説 ・補足 ・サイト内関連ページ
Excel VBA Diaryさんの正規表現クイズ
ツイッターで出題された全24問の正規表現に関する問題です。
解答ツイートでは図解で詳しく解説されています。




同じテーマ「マクロVBA技術解説」の記事

Dictionary(ディクショナリー)のパフォーマンスについて
VBAでのInternetExplorer自動操作
VBAでのSQLの基礎(SQL:Structured Query Language)
VBAで正規表現を利用する(RegExp)
VBAでメール送信する(CDO:Microsoft Collaboration Data Objects)
VBAでのOutlook自動操作
ADO(ActiveX Data Objects)の使い方の要点
特殊フォルダの取得(WScript.Shell,SpecialFolders)
参照設定、CreateObject、オブジェクト式の一覧
VBAのスクレイピングを簡単楽にしてくれるSelenium
VBA+SeleniumBasicで検索順位チェッカー作成


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ