VBA(Visual Basic for Applications)はExcelやWordなどのOffice製品をカスタマイズするのに便利な言語ですが、文字列処理においてはやや物足りないと感じたことはありませんか?
そんなときに活躍するのが「正規表現」です。VBAでも VBScript.RegExp
オブジェクトを使えば、柔軟かつ強力な文字列検索や置換が可能になります。
この記事では、VBAでの正規表現の使い方について、基礎から実践例までわかりやすく解説します。初心者の方でもすぐに活用できるように、丁寧にステップごとに説明していきます。
正規表現(Regular Expression)は、文字列のパターンを定義するための表現方法です。
例えば、メールアドレスの形式や電話番号の形式など、一定のパターンを持つ文字列を検出・抽出するのに最適です。
正規表現では、「任意の1文字」を表す .
や、「数字」を表す \d
、「繰り返し」を表す *
や +
などの特殊な記号を使います。
VBAでは、VBScriptの RegExp
オブジェクトを使ってこれらの表現を処理できます。
VBAで正規表現を使用するには、まず参照設定を行う必要があります。
この設定を行うことで、RegExp
オブジェクトが使えるようになります。
まずは、文字列の中にパターンが含まれているかを調べる「マッチ」の例を見てみましょう。
Sub 正規表現マッチ例()
Dim regEx As Object
Dim 対象文字列 As String
Dim パターン As String
Dim マッチ結果 As Boolean
Set regEx = CreateObject("VBScript.RegExp")
対象文字列 = "abc123def456"
パターン = "\d{3}"
With regEx
.Pattern = パターン
.IgnoreCase = True
.Global = False
End With
マッチ結果 = regEx.Test(対象文字列)
If マッチ結果 Then
MsgBox "3桁の数字が見つかりました"
Else
MsgBox "一致しませんでした"
End If
End Sub
このコードでは、文字列に「3桁の数字(\d{3})」が含まれているかを調べています。
マッチしている文字列をすべて取得したいときは、Matches
メソッドを使います。
Sub 正規表現一致抽出例()
Dim regEx As Object
Dim 対象文字列 As String
Dim パターン As String
Dim マッチ As Object
Dim item As Object
Set regEx = CreateObject("VBScript.RegExp")
対象文字列 = "電話番号: 03-1234-5678、FAX: 06-8765-4321"
パターン = "\d{2,4}-\d{2,4}-\d{4}"
With regEx
.Pattern = パターン
.IgnoreCase = True
.Global = True
End With
Set マッチ = regEx.Execute(対象文字列)
For Each item In マッチ
Debug.Print "見つかった電話番号: " & item.Value
Next
End Sub
この例では、電話番号の形式に一致するすべての文字列を抽出して、イミディエイトウィンドウに表示します。
一致した部分を他の文字列に置き換えるには Replace
メソッドを使います。
Sub 正規表現置換例()
Dim regEx As Object
Dim 対象文字列 As String
Dim パターン As String
Dim 結果文字列 As String
Set regEx = CreateObject("VBScript.RegExp")
対象文字列 = "ユーザーID: abc123"
パターン = "\w+"
With regEx
.Pattern = パターン
.IgnoreCase = True
.Global = False
End With
結果文字列 = regEx.Replace(対象文字列, "*****")
MsgBox 結果文字列
End Sub
このコードでは、最初の単語(英数字)を「*****」に置き換えています。
パターン | 意味例 |
---|---|
\d+ | 1文字以上の数字 |
\w+ | 1文字以上の英数字 |
[A-Za-z] | 英字のみ |
^abc | 先頭が「abc」 |
abc$ | 末尾が「abc」 |
. | 任意の1文字 |
.* | 任意の文字列(0回以上) |
\s+ | 空白文字(スペースやタブなど) |
業務データから郵便番号(123-4567形式)を抽出するケースを想定します。
Sub 郵便番号抽出()
Dim regEx As Object
Dim 対象文字列 As String
Dim パターン As String
Dim マッチ As Object
Dim item As Object
Set regEx = CreateObject("VBScript.RegExp")
対象文字列 = "顧客住所:東京都港区〇〇 123-4567"
パターン = "\d{3}-\d{4}"
With regEx
.Pattern = パターン
.Global = False
End With
Set マッチ = regEx.Execute(対象文字列)
If マッチ.Count > 0 Then
MsgBox "郵便番号は " & マッチ(0).Value
Else
MsgBox "郵便番号が見つかりませんでした"
End If
End Sub
VBAでの正規表現は便利ですが、以下のような制限もあります。
必要に応じて、VBAから外部ライブラリや.NET経由で処理する選択肢も検討できます。
VBAでの文字列処理において、正規表現は非常に強力なツールです。
Test
でパターン一致を判定Execute
で一致するすべての結果を取得Replace
で文字列の置換が可能日々の業務でデータを効率よく扱うためにも、ぜひ正規表現の活用を取り入れてみてください。
最初は少し難しく感じるかもしれませんが、基本のパターンを覚えるだけでできることが大きく広がります。