VBAで正規表現を利用する(RegExp)
正規表現は複雑なパターンマッチングとテキストの検索置換するためのツールです、
マクロVBAで正規表現を使う場合はRegExpオブジェクトを使用します、
RegExpは、VBScriptに正規表現として用意されているオブジェクトです。
VBScript 廃止に向けて、VBA プロジェクトを対応させる方法
詳細は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日

■判明したこと
当初は、CreateObject("VBScript.RegExp")これで遅延バインディングした時のReplaceメソッドでエラーが発生していました。
ですが、その後に修正が施されたようで、このエラーは解消されました。
そして、VBAにRegExpクラスが追加されたことにより、参照設定「Microsoft Scripting Runtime」も必要なくなりました。
Dim 変数 As New RegExp
これが参照設定なしで記述できるようになりました。
ただし、他のExcelバージョンでは使えませんので、配布する場合は参照設定するか、CreateObjectの実行時バインディングで記述してください。
目次
正規表現
正規表現RegExpの使い方
RegExpオブジェクト
RegExpの使用例
RegExp関連のオブジェクト
Execute(Matches,Match,SubMatches)の使用例
Replaceの使用例
先読み:肯定先読み、否定先読み
正規表現の実践例
メタ文字
^ $ ? * + . | { } \ [ ] ( )
正規表現
| シンボル | 機能 |
| 位置マッチング | |
| ^ | 文字列の先頭にのみマッチします。 |
| $ | 文字列の末尾にのみマッチします。 |
| \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の使い方
(バージョンは環境によります、1.0もありますが機能が違います。)
これを参照設定し、
Dim 変数 As New RegExp
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 |
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コレクション
このコレクションは、RegExpブジェクトのExecuteメソッドによってのみ作成可能です。
個別の Match オブジェクトのプロパティと同様、Matchesコレクションのプロパティは読み取り専用です。
| プロパティ | 説明 |
| Count | Count - コレクション内の Match オブジェクトの数を含んでいる読み取り専用の値。 |
| Item | Item - Matches コレクション オブジェクトから Match オブジェクトにランダムにアクセスできるようにする読み取り専用の値。 |
Matchオブジェクト
このメソッドが実際に返すのは、Matchオブジェクトのコレクションです。
Matchオブジェクトのプロパティは、すべて読み取り専用です。
| プロパティ | 説明 |
| FirstIndex | FirstIndex - 元の文字列内のマッチが起こった位置を含んでいる読み取り専用の値。 このインデックスは位置の記録に 基点を 0 とするオフセットを使用しており、文字列の最初の位置は 0 から始まります。 |
| Length | Length - マッチした文字列の合計の長さを含んでいる読み取り専用の値。 |
| Value | Value - マッチした値またはテキストを含んでいる読み取り専用の値。 これはまた、Match オブジェクトにアクセスするときの既定値でもあります。 |
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は対象外となります。
正規表現の実践例
解答ツイートでは図解で詳しく解説されています。
同じテーマ「マクロ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活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- VBAで正規表現を利用する(RegExp)
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.
