VBA 正規表現(Regex)

Written by

Editorial Team

Reviewed by

Steve Rynearson

Translated by

masahiro yoshida

Last updated on 3月 2, 2022

このチュートリアルでは、VBAで正規表現(Regex)を使用する方法について説明します。

Regexとは?

Regexは正規表現の略です。正規表現とは、一連の文字で構成されたパターンのことで、これを使用して別の文字列の中から一致するパターンを見つけることができます。VBAでRegexを使用するには、RegExpオブジェクトを使用する必要があります。

[A-C]のようなパターンは、AからCまでの連続する大文字のアルファベットから検索し、マッチングさせるために使用することができます。Regexパターンには独自の構文があり、文字や文字列を使用して作成することができます。

マッチする文字

以下の表は、Regexパターンを構築するための構文です。

パターンの構文 説明 マッチする文字列
. vbNewLine 以外の任意の1文字にマッチする f.n fan, fon, f@n, fwn
[characters] 大括弧[]で囲まれた任意の一文字にマッチする [fn] “fan”の”f”または “n”にのみマッチする
[^characters] 大括弧[]で囲まれていない任意の1文字にマッチする [fn] “fjn”の”j”にマッチする
[start-end] 大括弧[]の範囲に含まれる任意の文字にマッチする [1-5] “45”の”4″と”5″にマッチする
\w 英数字とアンダースコアにマッチし、空白文字にはマッチしない \w “,c.” の “c” にマッチする
\W 英数字以外の文字とアンダースコアにマッチする \W bb@bb “の”@”にマッチする
\s スペースやタブなどの空白文字にマッチする \s “This is”の” “にマッチする
\S 空白文字以外の文字にマッチする \S “T h”の”T”と”h”にマッチする
\d 任意の数字1桁にマッチする \d “a7h”の”7″にマッチする
\D 数字以外の任意の1文字にマッチする \D “47j”の”j”にマッチする
\ 特殊文字をエスケープして、検索できるようにする \. “59.pQ”の”.”にマッチする
\t タブ \t タブ文字にマッチする
\r キャリッジリターン \r キャリッジリターン(vbCr)にマッチする
\n vbNewLine(vbTab) \n 改行にマッチする

量的要素

文字列に対してパターンを何回マッチさせるかを指定するために、量詞を使用することができます。

量記号 説明 マッチする文字列
* 0回以上の繰り返しにマッチします fn*a fna, fa, fnna, fnnna, fnfnnna
+ 1回以上の繰り返しにマッチする fn+a fna, fnna, fnfnna
? 0または1個にマッチする fn?a fa, fna
{n} n 回に相当する回数 d\W{4} d….&5hi “の “d…. “にマッチする
{n,} 少なくとも”n”回の繰り返しにマッチする d\W{4,} d….&5hi “の “d….&”にマッチする
{n,m} n回からm回の繰り返しにマッチする d\W{1,8} d….&&&&5hi” の “d….&&&&” にマッチする

グループ化

グループ化またはキャプチャリングは、パターンを使って文字列の一部をキャプチャして抽出することができます。つまり、パターンにマッチするだけでなく、パターンにマッチした文字列の一部がキャプチャし、再利用することが可能となります。

パターン 説明 マッチする文字列とキャプチャ
(式) 括弧内のパターンをグループ化し、キャプチャする (\W{4}) “1@@@@1jlmba”から”@@@@”をグループ化してキャプチャします。

VBAで正規表現を使うには

VBAでRegexを使うには、まずVBEエディターで参照設定でライブラリを選択する必要があります。VBEエディターで、ツール > 参照設定 > Microsoft VBScript Regular Expressionsと進みます。

vba regex config

これらは、RegExpオブジェクトのプロパティです。

  • Pattern – 文字列に対するマッチングに使用するパターンです。
  • IgnoreCase – Trueの場合、マッチングでは文字の大文字と小文字が無視されます。
  • Global – Trueの場合、文字列中のパターンにマッチするものがすべて検出されます。Falseの場合は、最初のマッチングのみが検出されます。
  • MultiLine – Trueの場合、パターンマッチは改行をまたいで行われます。

これらはRegExpオブジェクトのメソッドです。

  • Test – 文字列内のパターンを検索し、一致するものがあれば True を返します。
  • Replace – パターンの出現箇所を置換文字列で置き換えます。
  • Execute – 文字列に対するパターンのマッチを返します。

パターンが文字列と一致するかどうかをテストする

Testメソッドを使うと、あるパターンが入力文字列中のあるシーケンスにマッチするかどうかを確認することができます。結果は、マッチした場合はTrueになります。次のコードでは、文字列に対してパターンをテストする方法を説明します。

Sub RegexTestingAPattern()

Dim stringOne As String
Dim regexOne As Object
Set regexOne = New RegExp

regexOne.Pattern = "f....a"

stringOne = "000111fjo88a8"

Debug.Print regexOne.Test(stringOne)

End Sub

その結果こうなります。

vba regex true

文字列のパターンを置き換える

Replaceメソッドを使用すると、文字列内の一致するパターンの最初のインスタンス、または文字列内の一致するパターンのすべてのインスタンスを置き換えることができます。GlobalがFalseに設定されている場合は、最初のインスタンスのみが置き換えられます。次のコードは、文字列内のパターンを置換する方法を示しています。

Sub RegexReplacingAPattern()
Dim stringOne As String
Dim regexOne As Object
Set regexOne = New RegExp

regexOne.Pattern = "This is the number"
regexOne.Global = False
stringOne = "This is the number 718901"

Debug.Print regexOne.Replace(stringOne, "This is the new number")
End Sub

その結果はこうなります。

vba regex picture1

上記で使用した文字列の番号部分のみを置換する場合は、以下のようなコードになります。

Sub RegexReplacingAPattern()
Dim stringOne As String
Dim regexOne As Object
Set regexOne = New RegExp

regexOne.Pattern = "[^\D]+"
regexOne.Global = False
stringOne = "This is the number 718901"

Debug.Print regexOne.Replace(stringOne, "777192")
End Sub

その結果こうなります。

vba regex picture2

文字列中の特定のパターンのインスタンスをすべて置き換えるには、グローバル値をTrueに設定します。次のコードは、文字列内のすべての -A1289C- のインスタンスを置換する方法を示しています。

Sub RegexReplacingEveryInstanceOfAPattern()
Dim stringOne As String
Dim regexOne As Object
Set regexOne = New RegExp

regexOne.Pattern = "╱WA╱d+C╱W"
regexOne.Global = True
stringOne = "ABC-A1289C-ABC-A1289C-ABC"

Debug.Print regexOne.Replace(stringOne, "IJK")
End Sub

vba regex picture3

文字列中のパターンにマッチして表示する

Executeメソッドを使用すると、文字列内のパターンの1つまたはすべてのインスタンスにマッチさせることができます。次のコードは、文字列からパターンのすべてのインスタンスにマッチして表示する方法を示しています。

Sub RegexMatchingAndDisplayingAPattern()
Dim stringOne As String
Dim regexOne As Object
Dim theMatches As Object
Dim Match As Object
Set regexOne = New RegExp

regexOne.Pattern = "A.C"
regexOne.Global = True
regexOne.IgnoreCase = True
stringOne = "ABC-A1289C-ADC-A1289C-AJC"

Set theMatches = regexOne.Execute(stringOne)

For Each Match In theMatches
  Debug.Print Match.Value
Next

End Sub

結果はこうなります。

vba regex picture4

例えば、上の文字列から-ADC-だけをマッチングさせたいとします。次のコードは、文字列から -ADC- だけをマッチさせて表示する方法を示しています。

Sub RegexMatchingAndDisplayingAPattern()
Dim stringOne As String
Dim regexOne As Object
Dim theMatches As Object
Dim Match As Object
Set regexOne = New RegExp

regexOne.Pattern = "\-\A.C\-"
regexOne.Global = False
regexOne.IgnoreCase = True
stringOne = "ABC-A1289C-ADC-A1289C-AEC"

Set theMatches = regexOne.Execute(stringOne)

For Each Match In theMatches
  Debug.Print Match.Value
Next

End Sub

vba regex picture5

Regexは習得に時間がかかりますが、文字列を識別したり操作したりするための非常に強力なツールです。また、プログラミング言語の枠を超えて広く使われています。

vba-free-addin

VBA Code Examples Add-in

Easily access all of the code examples found on our site.

Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.

(No installation required!)

Free Download

Return to VBA Code Examples