VBAで正規表現を利用するには

VBAでも正規表現が利用できます。正規表現を利用するにはVBScriptのRegExpクラスを利用します。RegExpはRegular Expressionの略です。

RegExpクラスを使うには使い方に順序があり、事前にインスタンスの生成(New RegExpもしくはCreateObject関数)が必要になります。そしてインスタンス生成後にRegExpクラスの各種プロパティへの設定を行ったあとに正規表現での文字列処理の実行を行います。

このあたりについては後述しています。

なお、VBAで扱える正規表現のメタ文字についての詳細は「VBAで扱える正規表現の種類」をご参照ください。

事前に参照設定を行う

RegExpクラスを利用するには2通りの方法があります。

  1. CreateObject関数でRegExpクラスのインスタンスを生成する方法
  2. 参照設定する方法

どちらの方法でもいいのですが、参照設定をした方が便利です。正規表現の参照設定の方法は次の通りです。

  1. VBAの画面でツールメニュー→参照設定 を選択します。
  2. 参照設定ダイアログで「Microsoft VBScript Regular Expressions 5.5」にチェックを付けます。
  3. OKボタンを押して閉じます。

これで設定は終わりです。

RegExpクラスの変数宣言の書き方

RegExpクラスの変数宣言とインスタンスの生成の書き方について、参照設定をした場合とCreateObject関数を使った場合のそれぞれの書き方を説明します。

参照設定を使った場合の書き方

1行で書く方法と2行に分けて書く方法があります。厳密な意味で安全なのは2行に分けて書く方法です。

ただ、1行で書いても構いません。私は1行で書くことが圧倒的に多いです。この理由については「VBAでクラス変数の宣言とNewを1行で書いてよいか」をご参照ください。

CreateObject関数を使った場合の書き方

 

RegExpクラスのプロパティとメソッド

RegExpクラスには3つのプロパティと3つのメソッドがあります。

プロパティ

Global 指定文字列の中に事前に設定された正規表現の検索パターンがあるか検索する際に、指定文字列の左端から1度だけ検索(False)するか、1度見つかったあともその右側の残りの文字列に対しても検索(True)するかを指定します。既定値はFalseです。

Executeメソッドの結果とReplaceメソッドの結果に影響します。Testメソッドには影響しません。

Executeメソッドの場合は検索一致した最初の部分だけか、検索一致した全ての部分のどちらをMatchesCollectionオブジェクトに格納するかに影響します。Replaceメソッドの場合は最初に見つかった部分だけを置換するか、指定文字列の中で見つかった置換対象部分全てを置換するかの違いに影響します。

<構文>
Property Global As Boolean

IgnoreCase Patternプロパティで指定した検索パターンで、大文字と小文字を区別するかどうかを指定します。区別しない場合はTrueを指定します。区別する場合はFalseを指定します。省略時はFalse扱いになります。

<構文>
Property IgnoreCase As Boolean

Pattern Executeメソッド、Replaceメソッド、Testメソッドの引数文字列に対する正規表現の検索パターンを指定します。数字1文字を検索する場合は「”[0-9]”」、英単語を検索する場合は「”[a-zA-Z]+”」のように正規表現の文字列を指定します。事前に設定済みの検索パターンを取得することも可能です。

<構文>
Property Pattern As String

メソッド

Execute 事前に設定された正規表現での検索パターンが、指定された文字列に含まれるか検索し、検索結果をMatchesCollectionオブジェクトで返します。検索で見つからなかった場合は空のMatchesCollecionオブジェクトを返します。

<構文>
Function Execute(sourceString As String) As Object

sourceString 検索対象文字列を指定します。
戻り値 定義上の戻り値のデータ型はObject型になっていますが、検索結果をMatchesCollectionオブジェクトで返します。検索で見つからなかった場合は空のMatchesCollecionオブジェクトを返します。
Replace 指定された文字列の中から、事前に設定された正規表現での検索パターンで見つかった部分を、置換後文字列で置換します。

<構文>
Function Replace(sourceString As String, replaceVar) As String

sourceString 検索対象文字列を指定します。
replaceVar 置換後の文字列を指定します。
戻り値 検索対象文字列に対して正規表現での置換を行った結果を文字列で返します。
Test 事前に設定された正規表現での検索パターンが、指定された文字列に含まれるかどうかをBoolean型で返します。一致する文字列があればTrueを返し、一致する文字列がなければFalseを返します。

<構文>
Function Test(sourceString As String) As Boolean

sourceString 検索対象文字列を指定します。
戻り値 指定された文字列に含まれるかどうかをBoolean型で返します。一致する文字列があればTrueを返し、一致する文字列がなければFalseを返します。

 

RegExpクラスの使い方

RegExpクラスを使う際には以下の流れを守る必要があります。

  1. 検索範囲(Globalプロパティ)、大文字小文字の扱い(IgnoreCaseプロパティ)、検索文字列(Patternプロパティ)を設定します。
  2. そのあとに検索(Executeメソッド)や置換(Replaceメソッド)や存在チェック(Testメソッド)を実行します。
  3. 検索結果を判定します。(MatchCollectionコレクション、Matchオブジェクト、SubMatchesコレクション)

実行結果は以下の通りです。

 

注意点:MatchesではなくMatchCollectionが正しい

以下のMicrosoftのヘルプにExecuteメソッドについて戻り値はMatchesコレクション、と書いてありますが、正しくは MatchCollectionコレクションです。

https://msdn.microsoft.com/ja-jp/library/cc392389.aspx

いろんなサイトでもMicrosoftのヘルプに合わせているのか「Matchesコレクション」と書いてあることが多いようです。

CreateObjectを利用していて気が付いていないのかもしれません。