この記事では、VBA(Visual Basic for Applications)で正規表現を使う方法について、非常に詳細にわたって解説します。正規表現はテキスト処理において非常に強力なツールですが、VBAでの利用方法が一般的にはあまり知られていません。この記事を読むことで、VBAで正規表現を使いこなすスキルが身につきます。

正規表現とは?
正規表現(Regular Expression)は、テキスト内の特定のパターンを検索、置換するための表現方法です。例えば、メールアドレスや電話番号など、特定の形式に従った文字列を検出する際に使用されます。正規表現は非常に多機能であり、一度マスターすれば、テキスト処理が格段に効率的になります。
VBAでの正規表現の利用環境
VBAで正規表現を使うには、VBScriptが便利です。ただし、正規表現をサポートしているVBScriptはVer5.0からです。
Late BindingとEarly Binding
VBAで正規表現を使う場合、RegExpオブジェクトを参照する必要があります。この参照方法には、Late BindingとEarly Bindingの2種類があります。この記事では、Late Bindingを使用したサンプルコードを提供します。
RegExpオブジェクトのプロパティとメソッド
正規表現を使うためには、RegExpオブジェクトのプロパティとメソッドを理解することが重要です。
| プロパティ/メソッド | 説明 |
|---|---|
| Pattern | 正規表現で使用するパターンを設定します。例えば、[A-Z]は大文字のアルファベットにマッチします。 |
| IgnoreCase | 大文字と小文字を区別しない場合はTrueを設定します。デフォルトはFalseです。 |
| Global | 検索対象の文字列全体を検索する場合はTrueを設定します。デフォルトではFalseです。 |
| Test | 正規表現によるマッチングを行います。パターンと一致した場合はTrueを返します。 |
| Replace | 検索文字列内でマッチングを行い、成功するとその部分を置換します。 |
| Execute | マッチングの結果をMatchesコレクションとして返します。 |
MatchesコレクションとMatchオブジェクト
MatchesコレクションはExecuteメソッドによって返されるコレクションです。このコレクションには、Matchオブジェクトが0個以上含まれます。
| プロパティ/メソッド | 説明 |
|---|---|
| Count | Matchesコレクション内でMatchオブジェクトの個数を返します。これを調べるとマッチングの成功/失敗がわかります。 |
| Item | 一般的なコレクションのItemプロパティです。通常はMatches(0)のようにインデックスでアクセスします。 |
サンプルコード集
サンプル1:数字だけを抽出する

このサンプルでは、与えられた文字列から数字だけを抽出します。
Dim RE As Object, strPattern As String, strInput As String, Matches As Object
Set RE = CreateObject("VBScript.RegExp")
strPattern = "\d+"
strInput = "年齢は25歳です"
With RE
.Pattern = strPattern
.Global = True
Set Matches = .Execute(strInput)
End With
If Matches.Count > 0 Then
MsgBox Matches(0).Value
End If
Set RE = Nothing
処理の流れ
RegExpオブジェクトを作成します。- 正規表現のパターン(この場合は
\d+)を設定します。このパターンは1つ以上の数字に一致します。 Executeメソッドで文字列を検索し、結果をMatchesオブジェクトに格納します。MatchesオブジェクトのCountプロパティで一致した数を確認し、一致があればその値をメッセージボックスで表示します。
サンプル2:メールアドレスを検出する

このサンプルでは、与えられたテキストからメールアドレスを検出します。
Dim RE As Object, strPattern As String, strInput As String, Matches As Object, Match As Variant
Set RE = CreateObject("VBScript.RegExp")
strPattern = "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
strInput = "私のメールアドレスはexample@example.comです。"
With RE
.Pattern = strPattern
.Global = True
Set Matches = .Execute(strInput)
End With
For Each Match In Matches
MsgBox Match.Value
Next Match
Set RE = Nothing
処理の流れ
RegExpオブジェクトを作成します。- メールアドレスに一致する正規表現のパターンを設定します。
Executeメソッドで文字列を検索し、結果をMatchesオブジェクトに格納します。Matchesオブジェクトをループして、一致したメールアドレスをメッセージボックスで表示します。
サンプル3:日付形式(YYYY/MM/DD)を検出する

このサンプルでは、与えられたテキストから日付形式(YYYY/MM/DD)を検出します。
Dim RE As Object, strPattern As String, strInput As String, Matches As Object, Match As Variant
Set RE = CreateObject("VBScript.RegExp")
strPattern = "\d{4}/\d{2}/\d{2}"
strInput = "今日の日付は2023/09/23です。"
With RE
.Pattern = strPattern
.Global = True
Set Matches = .Execute(strInput)
End With
For Each Match In Matches
MsgBox Match.Value
Next Match
Set RE = Nothing
処理の流れ
RegExpオブジェクトを作成します。- 日付形式に一致する正規表現のパターンを設定します。
Executeメソッドで文字列を検索し、結果をMatchesオブジェクトに格納します。Matchesオブジェクトをループして、一致した日付をメッセージボックスで表示します。
サンプル4:URLを検出する

このサンプルでは、与えられたテキストからURLを検出します。
Dim RE As Object, strPattern As String, strInput As String, Matches As Object, Match As Variant
Set RE = CreateObject("VBScript.RegExp")
strPattern = "https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(/[a-zA-Z0-9.-]*)*"
strInput = "私のウェブサイトはhttps://example.comです。"
With RE
.Pattern = strPattern
.Global = True
Set Matches = .Execute(strInput)
End With
For Each Match In Matches
MsgBox Match.Value
Next Match
Set RE = Nothing
処理の流れ
RegExpオブジェクトを作成します。- URLに一致する正規表現のパターンを設定します。
Executeメソッドで文字列を検索し、結果をMatchesオブジェクトに格納します。Matchesオブジェクトをループして、一致したURLをメッセージボックスで表示します。
サンプル5:電話番号を検出する

このサンプルでは、与えられたテキストから日本の電話番号を検出します。
Dim RE As Object, strPattern As String, strInput As String, Matches As Object, Match As Variant
Set RE = CreateObject("VBScript.RegExp")
strPattern = "0\d{1,4}-\d{1,4}-\d{4}"
strInput = "お問い合わせは0120-1234-5678まで。"
With RE
.Pattern = strPattern
.Global = True
Set Matches = .Execute(strInput)
End With
For Each Match In Matches
MsgBox Match.Value
Next Match
Set RE = Nothing
処理の流れ
RegExpオブジェクトを作成します。- 電話番号に一致する正規表現のパターンを設定します。
Executeメソッドで文字列を検索し、結果をMatchesオブジェクトに格納します。Matchesオブジェクトをループして、一致した電話番号をメッセージボックスで表示します。
サンプル6:全角カタカナを検出する

このサンプルでは、与えられたテキストから全角カタカナを検出します。
Dim RE As Object, strPattern As String, strInput As String, Matches As Object, Match As Variant
Set RE = CreateObject("VBScript.RegExp")
strPattern = "[ァ-ヶー]+"
strInput = "これはテストです。カタカナも含まれています。"
With RE
.Pattern = strPattern
.Global = True
Set Matches = .Execute(strInput)
End With
For Each Match In Matches
MsgBox Match.Value
Next Match
Set RE = Nothing
処理の流れ
RegExpオブジェクトを作成します。- 全角カタカナに一致する正規表現のパターンを設定します。
Executeメソッドで文字列を検索し、結果をMatchesオブジェクトに格納します。Matchesオブジェクトをループして、一致した全角カタカナをメッセージボックスで表示します。
VBAの正規表現に関するFAQ
Q:VBAで正規表現を使いたい場合、どのように設定すればいいですか?
A:VBAで正規表現を使用するには、VBScript.RegExpオブジェクトを作成する必要があります。このオブジェクトを使って、正規表現のパターンを設定し、テキストの検索や置換を行います。
Q:RegExpオブジェクトの主要なプロパティは何ですか?
A:RegExpオブジェクトには主にPattern、IgnoreCase、Globalといったプロパティがあります。Patternは検索する正規表現のパターンを設定します。IgnoreCaseは大文字と小文字を区別するかどうかを設定します。Globalは全ての一致を検索するか、最初の一致だけを検索するかを設定します。
Q:正規表現で特定の文字列を検索する基本的なコードは?
A:基本的なコードは以下のようになります。
Dim RE As Object
Set RE = CreateObject("VBScript.RegExp")
With RE
.Pattern = "検索するパターン"
.Global = True
' その他の設定
End With
この設定を元に、Executeメソッドで文字列を検索することができます。
Q:GlobalプロパティをTrueに設定すると何が起きますか?
A:GlobalプロパティをTrueに設定すると、指定したテキスト全体から一致するすべての文字列を検索します。Falseに設定すると、最初に一致した文字列だけを返します。
Q:正規表現で複数行にまたがるテキストを検索する方法は?
A:VBAのRegExpオブジェクトは複数行モードをサポートしていません。しかし、改行文字を明示的に指定することで、複数行にまたがるテキストも検索可能です。
Q:正規表現で特定の文字列を置換するにはどうすればいいですか?
A:RegExpオブジェクトのReplaceメソッドを使用します。このメソッドは、一致する文字列を指定した文字列に置換します。
Q:特定のパターンに一致するかどうかだけを確認したい場合は?
A:RegExpオブジェクトのTestメソッドを使用します。このメソッドは、指定したテキスト内に一致する文字列が存在するかどうかを真偽値で返します。
関連動画
まとめ
この記事では、VBAで正規表現を使う方法について、多くの目的別サンプルコードとともに詳しく解説しました。正規表現は非常に強力なツールであり、この記事を通じてその使い方について理解が深まったことでしょう。この知識を活かして、VBAでのテキスト処理をより効率的に行いましょう。
Excelのショートカットキーの練習
当サイトはショートカットキーの練習を実際の動きを確認しながら練習できる機能がついています。繰り返し指を動かして練習ができるので、ゲーム感覚で遊んでいくうちに自然とショートカットキーが使えるようになれます。ショートカットキーは暗記するよりも実際に手を動かして練習していったほうが習得が早くなるので、是非当サイトをブックマークに登録し定期的に練習してみてください。下記のSTARTキーを押下すると練習を始められます。
※推奨ブラウザ Google Chrome
