Categories: excel

VBAで正規表現を使いこなす!基本から実用例まで徹底解説

VBA(Visual Basic for Applications)はExcelやWordなどのOffice製品をカスタマイズするのに便利な言語ですが、文字列処理においてはやや物足りないと感じたことはありませんか?
そんなときに活躍するのが「正規表現」です。VBAでも VBScript.RegExp オブジェクトを使えば、柔軟かつ強力な文字列検索や置換が可能になります。

この記事では、VBAでの正規表現の使い方について、基礎から実践例までわかりやすく解説します。初心者の方でもすぐに活用できるように、丁寧にステップごとに説明していきます。


正規表現とは何か?

正規表現(Regular Expression)は、文字列のパターンを定義するための表現方法です。
例えば、メールアドレスの形式や電話番号の形式など、一定のパターンを持つ文字列を検出・抽出するのに最適です。

正規表現では、「任意の1文字」を表す . や、「数字」を表す \d、「繰り返し」を表す *+ などの特殊な記号を使います。
VBAでは、VBScriptの RegExp オブジェクトを使ってこれらの表現を処理できます。


VBAで正規表現を使う準備

VBAで正規表現を使用するには、まず参照設定を行う必要があります。

  1. VBAエディタを開く(Alt + F11)
  2. メニューから「ツール」>「参照設定」を選択
  3. 「Microsoft VBScript Regular Expressions 5.5」にチェックを入れる

この設定を行うことで、RegExp オブジェクトが使えるようになります。


正規表現の基本的な使い方(Match編)

まずは、文字列の中にパターンが含まれているかを調べる「マッチ」の例を見てみましょう。

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編)

マッチしている文字列をすべて取得したいときは、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編)

一致した部分を他の文字列に置き換えるには 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での正規表現は便利ですが、以下のような制限もあります。

  • Lookbehind(後読み)など、一部の高度な正規表現には対応していない
  • VBScript.RegExpはUnicode対応が不完全(全角文字に注意)
  • 文字列が長すぎると処理が重くなることもある

必要に応じて、VBAから外部ライブラリや.NET経由で処理する選択肢も検討できます。


まとめ

VBAでの文字列処理において、正規表現は非常に強力なツールです。

  • Test でパターン一致を判定
  • Execute で一致するすべての結果を取得
  • Replace で文字列の置換が可能

日々の業務でデータを効率よく扱うためにも、ぜひ正規表現の活用を取り入れてみてください。
最初は少し難しく感じるかもしれませんが、基本のパターンを覚えるだけでできることが大きく広がります。

upandup

Web制作の記事を中心に、暮らし、ビジネスに役立つ情報を発信します。 アフィリエイトにも参加しています。よろしくお願いいたします。