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

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
最終更新日:2021-06-02

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


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


目次

メタ文字

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


正規表現

シンボル 機能
位置マッチング
^ 文字列の先頭にのみマッチします。
$ 文字列の末尾にのみマッチします。
\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に変換
ツイッターで出したエクセルの入力規則のお題です。「greeenはgreenに、greeeeeNやGReeeeeenはGReeeeNに直す」文字列操作のVBA問題です。問題を出したツイート 【VBA問題】 greenは緑です。
数式の関数の使用回数、関数名を配列で返す
ツイッターで出したエクセルVBAのお題です。セルに入っている計算式に使われている関数(ユーザー定義含む)を数えてみましょう、というお題になります。問題を出したツイート 【VBAお題】セルに計算式が入っています。
VBA100本ノック 16本目:無駄な改行を削除
文字列内の無駄な改行コードを削除する問題です。エクセルのセル内改行はLFですが、無駄に多く入っている改行コードを削除します。ツイッター連動企画です。ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。
VBA100本ノック 24本目:全角英数のみ半角
全角英数のみ半角かつ大文字にするFunctionを作成する問題です。ツイッター連動企画です。ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。VBAテスト用のサンプルデータはご自身でご用意ください。
VBA100本ノック 72本目:ITをDXに変換(文字列操作)
引数の文字列に対して、全ての"IT"を"DX"に置換するFunctionを作成する問題です。ツイッター連動企画です。ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。
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 ・・・新着記事一覧を見る

エクセル関連で「いいね」の多かったツイート|エクセル雑感(2021-05-17)
キーボード操作だけで非表示列を表示|エクセル雑感(2021-05-11)
変数を考えることはロジックを考える事|エクセル雑感(2021-04-11)
RangeオブジェクトのFor EachとAreasについて|VBA技術解説(2021-04-08)
PropertyのSetはLetでも良い|VBA技術解説(2021-03-31)
エクセル麻雀ミニゲーム|VBAサンプル集(2021-03-09)
VBA100本ノック 100本目:WEBから100本ノックのリストを取得|VBA練習問題(2021-03-03)
VBA100本ノック 魔球編:2桁の最小公倍数|VBA練習問題(2021-02-02)
Select Caseでの短絡評価(ショートサーキット)の使い方|VBA技術解説(2021-01-03)
VBA100本ノック 迷宮編:巡回セル問題|VBA練習問題(2020-12-31)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.Excelショートカットキー一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.RangeとCellsの使い方|VBA入門
5.マクロって何?VBAって何?|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
8.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
9.セルに文字を入れるとは(Range,Value)|VBA入門
10.とにかく書いてみよう(Sub,End Sub)|VBA入門




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


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



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