VBAで正規表現を活用!RegExpの設定・使用例・注意点まとめ

当ページのリンクには広告 (Amazonアソシエイト含む) が含まれています。
アイキャッチ

「VBAで正規表現を使って効率的に文字列を検索・置換したいけど、やり方がわからない…」
このような悩みをお持ちではありませんか?


VBAで文字列をもっと細かい条件で検索したい

・データを一括で置換する方法が知りたい

そもそも正規表現って何ができるの?

これらの問題を解決してくれるのが
VBAの「正規表現」です!


この記事では、「VBAでの正規表現の使い方」を、基本から応用まで分かりやすく解説します!

正規表現をマスターすれば、「作業時間の大幅短縮」や「ミスの削減」につながり、日々の業務が劇的に効率化します!
例えば、数千行のExcelデータから特定のパターンだけを抽出したり、複雑な文字列の置換を一瞬で処理することが可能になります。

初心者でも安心して理解できるよう、基礎から実務で役立つ応用例まで、わかりやすく解説していますので、ぜひ最後までお読みください。


【 この記事の概要 】

よく使う度
難しさ
覚えておくと安心度

VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?

そんな方には、UdemyのVBA講座がおすすめです。

動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べるVBA講座はこちら  /

目次

この記事で「できるようになる」こと

スポンサーリンク

正規表現とは?初心者向けにやさしく解説!

そもそも正規表現ってなに? どんなことができるの?

正規表現は、一言で言うと
文字列のパターンを指定して検索や置換ができる便利なルール
です。

普段、ExcelやVBAでデータを扱う中で、「特定の条件に合う文字列だけを探したい」と思う場面はありませんか?
正規表現を使えば、その条件を非常に柔軟に設定でき、簡単にデータを操作することができます。

ここでは、正規表現の基本を初心者でもわかりやすいように3つのポイントに絞って解説します。

正規表現でできる3つの具体例

正規表現を使うと、次のようなことが可能になります。

正規表現でできること
  • 数字だけを抜き出す
    例: 「123ABC456」から「123」と「456」だけを抽出。
  • 特定の形式に合うデータを検索する
    例: 「メールアドレスの一覧」や「日付フォーマット(YYYY/MM/DD)」を検索。
  • 条件に合う文字列を置換する
    例: 「2025/01/09」を「2025-01-09」の形式に変更。

正規表現が便利な3つの場面

正規表現は、以下のような場面で特に力を発揮します。

どんな場面で便利?
  • 重複や不要なデータを削除
    • 余計な空白や、特定の文字列を一括削除する際に便利です。
  • データのクリーニング
    • Excelで入力ミスやフォーマットのバラつきがあるデータを、一括で修正する際に便利です。
      例: 「123-456-7890」の電話番号形式を「1234567890」に統一。
  • 大量のデータから特定のパターンを抽出
    • 数千行のデータから、「@」が含まれるメールアドレスだけを抽出するなど、大量データ処理に役立ちます。

VBAで正規表現を使う準備をご紹介

まず、VBAで正規表現を使うには、Microsoftの「Microsoft VBScript Regular Expressions 5.5」ライブラリを参照設定する必要があります。

以下の手順で設定してください。

【手順】正規表現ライブラリの参照設定

1. Excelを開き、Alt + F11 を押してVBAエディタを開きます。
 これで、VBAのコードを記述できる編集画面が表示されます。

1. Excelを開き、Alt + F11 を押してVBAエディタを開きます。

2. メニューから「ツール」→「参照設定」をクリックします。
 参照設定ダイアログボックスが表示されます。

2. メニューから「ツール」→「参照設定」をクリックします。

3. 「Microsoft VBScript Regular Expressions 5.5」を選択
 一覧から「Microsoft VBScript Regular Expressions 5.5」を見つけ、チェックを入れて「OK」をクリックします。


これで、VBAコード内で正規表現が使えるようになりました!

スポンサーリンク

正規表現の基礎をご紹介 | VBAで始める正規表現の第一歩

正規表現をVBAで使うためには、基本的な設定や構文を理解しておくことが重要です。

ここでは、実際にVBAで正規表現を使ったコード例を見てみましょう。
このコードでは、次のような動作を実行します。

このコードの内容
  • 文字列の中から「数字」を検索して抽出する。
  • 検索結果の数や、各一致部分の詳細(位置、長さ、値)を取得する。
  • 「年」「月」「日」をサブマッチ(部分一致)として取り出す。
Sub RegexMatches()
    Dim regEx As Object       '// 正規表現オブジェクト
    Dim matches As Object     '// Matchesコレクション
    Dim match As Object       '// Matchオブジェクト
    Dim testString As String  '// 検索対象文字列

    '// 正規表現オブジェクトの作成
    Set regEx = CreateObject("VBScript.RegExp")
    
    '// 検索対象文字列
    testString = "今日は2025年1月9日です。数字は123456です。"

    '// 正規表現の設定(サブマッチを含むパターン)
    regEx.Pattern = "(\d{4})年(\d{1,2})月(\d{1,2})日|\d+"  '//年、月、日をサブマッチとして取得し、それ以外の数字も一致させる
    regEx.Global = True        '// 全体検索を有効にする
    regEx.IgnoreCase = True    '// 大文字小文字を区別しない

    '// 正規表現の実行(一致部分を取得)
    Set matches = regEx.Execute(testString)

    '// 一致部分を確認(Matchesコレクションのカウント)
    MsgBox "一致した部分の数: " & matches.Count

    '// 各一致部分をループで確認
    For Each match In matches
        '// Matchオブジェクトのプロパティを取得
        MsgBox "一致した値: " & match.Value & vbCrLf & _
               "位置: " & match.FirstIndex & vbCrLf & _
               "長さ: " & match.Length

        '// サブマッチがある場合の確認(ループを使用)
        If match.SubMatches.Count > 0 Then
            Dim i As Long
            Dim subMatchResult As String
            subMatchResult = "サブマッチの詳細:" & vbCrLf
            For i = 0 To match.SubMatches.Count - 1
                subMatchResult = subMatchResult & _
                    "サブマッチ" & i + 1 & ": " & match.SubMatches(i) & vbCrLf
            Next i
            MsgBox subMatchResult
        End If
    Next
End Sub

1) 正規表現を使う準備をしよう(オブジェクト作成の基本を解説)

正規表現を使うためには、まず「正規表現オブジェクト」を作成する必要があります。
以下のコードでその準備を行います。

Dim regEx As Object   '// 正規表現オブジェクトを格納する変数を宣言

Set regEx = CreateObject("VBScript.RegExp") '// 正規表現オブジェクトを作成
コードを解説
  • Dim regEx As Object
    • 正規表現オブジェクトを格納するための変数を宣言します。
      VBAには正規表現専用の型がないため、Object型として宣言します。
  • Set regEx = CreateObject(“VBScript.RegExp”)
    • VBScriptの正規表現オブジェクトを作成し、それを変数にセットします。

補足情報

  • ここは丸覚えでもOK!
    • 実務ではこの書き方をそのまま覚えて使えば問題ありません。
      「VBScript.RegExp」の部分は、正規表現を扱うために必要な設定だと考えましょう。
  • New」を使う方法もある
    • CreateObject を使わずに、New キーワードを使って正規表現オブジェクトを作成することも可能です。
      • CreateObject は参照設定が不要で手軽に使える方法です。
        一方、New は参照設定が必要ですが、コード補完が使えるのでミスが減るメリットがあります。
        CreateObject は参照設定不要で手軽に始められるため、初心者の方はこちらの方法をおすすめします。
Dim regEx As New VBScript_RegExp_55.RegExp

2) 検索対象の文字列と正規表現パターンを設定 (Pattern・Global・IgnoreCase)

次に、検索したい文字列と正規表現のパターンを設定します。
以下のコードでは、「2025年1月9日」のような数字を含む文字列から、数字を抽出する正規表現を設定しています。

testString = "今日は2025年1月9日です。数字は123456です。"

regEx.Pattern = "(\d{4})年(\d{1,2})月(\d{1,2})日|\d+"
regEx.Global = True
regEx.IgnoreCase = True
コードを解説
  • testString
    • 検索対象となる文字列です。
      この例では「今日は2025年1月9日です。数字は123456です。」という文字列を使用しています。
  • regEx.Pattern
    • 検索条件を指定するプロパティです。
      この例では、(\d{4})年(\d{1,2})月(\d{1,2})日|\d+ を使用して検索をしています。
      このように正規表現のパターンで使う特殊な記号をメタ文字といいます。

      また、このコード例は、年月日の箇所に括弧()を記述しています。
      これは、サブマッチを指定する方法となります。
      サブマッチを使用しない場合は、\d{4}年\d{1,2}月\d{1,2}日|\d+でも問題なく動作を行います。
      • (\d{4}): 4桁の数字を「年」としてキャプチャ。
      • (\d{1,2}): 1桁または2桁の数字を「月」「日」としてキャプチャ。
      • |\d+: その他の連続した数字(例: 「123456」)を取得。

        よく使われるメタ文字の設定を見てみる
  • regEx.Global
    • True に設定することで、文字列全体を検索し、複数の一致を見つけることができます。
    • Falseにすると、最初の一致だけが対象になります。
  • regEx.IgnoreCase
    • Trueに設定することで、大文字と小文字を区別しない検索を行うことができます。
      たとえば、Patternabc を設定した場合、以下のような文字列にも一致します。
      • 「abc」・「ABC」・「AbC」

頻出する正規表現のメタ文字(基本編)

正規表現でよく使われるメタ文字の中から、頻出度の高いものを以下にまとめました。
これを覚えておくだけで、多くの検索・抽出が実現できます。

スクロールできます
メタ文字意味使用例
\d数字(0~9)\d+ → 「123」「456」に一致
\w英数字またはアンダースコア([a-zA-Z0-9_])\w+ → 「abc123」に一致
\s空白文字(スペースやタブ)\s+ → 空白部分に一致
.任意の1文字a.c → 「abc」「axc」に一致
+直前の文字が1回以上繰り返されるa+ → 「a」「aaa」に一致
*直前の文字が0回以上繰り返されるa* → 「」「a」「aaa」に一致
^行頭を表す^Hello → 「Hello」で始まる文字列に一致
$行末を表すworld$ → 「world」で終わる文字列に一致

正規表現の主要プロパティ(Pattern, Global, IgnoreCase)

正規表現オブジェクトには複数のプロパティがあります。
ここでは特に頻出の3つをテーブルにまとめました。

スクロールできます
プロパティ説明使用
Pattern検索条件を指定します。
正規表現パターンそのものを設定するプロパティです。
\d+
→ 「1つ以上の連続した数字」に一致
GlobalTrueにすると複数の一致を検索します。
Falseにすると最初の一致のみ検索。
True
→ 「abc123abc456」から「123」「456」をすべて抽出
IgnoreCaseTrueにすると大文字と小文字を区別しない検索が
可能になります。
True → 「abc」「ABC」「AbC」すべてに一致。
False→ 大小区別される。

3) 結果を確認してメッセージを表示する仕組み

最後に、正規表現パターンに一致するかどうかを確認し、その結果をメッセージボックスで表示します。

'// 正規表現の実行(一致部分を取得)
Set matches = regEx.Execute(testString)

'// 一致部分を確認(Matchesコレクションのカウント)
MsgBox "一致した部分の数: " & matches.Count

'// 各一致部分をループで確認
For Each match In matches
    '// Matchオブジェクトのプロパティを取得
    MsgBox "一致した値: " & match.Value & vbCrLf & _
           "位置: " & match.FirstIndex & vbCrLf & _
           "長さ: " & match.Length

    '// サブマッチがある場合の確認(ループを使用)
    If match.SubMatches.Count > 0 Then
        Dim i As Long
        Dim subMatchResult As String
        subMatchResult = "サブマッチの詳細:" & vbCrLf
        For i = 0 To match.SubMatches.Count - 1
            subMatchResult = subMatchResult & _
                "サブマッチ" & i + 1 & ": " & match.SubMatches(i) & vbCrLf
        Next i
        MsgBox subMatchResult
    End If
Next
コードを解説
  • Set matches = regEx.Execute(testString)
    • Executeメソッドを使うことで、検索対象文字列(testString)から正規表現パターンに一致するすべての部分を取得します。
      ⇒ 一致部分が含まれる「Matchesコレクション」を返します。

      正規表現の主要メソッドを見てみる
  • MsgBox “一致した部分の数: ” & matches.Count
  • For Each match In matches
    MsgBox “一致した値: ” & match.Value & vbCrLf & _
    “位置: ” & match.FirstIndex & vbCrLf & _
    “長さ: ” & match.Length
    Next
    • matches コレクションの各要素は、Matchオブジェクトとして扱われます。
      Matchオブジェクトのプロパティを使って一致部分の詳細を取得できます。

      Matchオブジェクトを見てみる
  • If match.SubMatches.Count > 0 Then
    Dim i As Long
    Dim subMatchResult As String
    subMatchResult = “サブマッチの詳細:” & vbCrLf
    For i = 0 To match.SubMatches.Count – 1
    subMatchResult = subMatchResult & _
    “サブマッチ” & i + 1 & “: ” &match.SubMatches(i) & vbCrLf
    Next i
    MsgBox subMatchResult
    End If
    • 正規表現のパターンに括弧()を含む場合、サブマッチ(部分一致)が取得できます。
      この情報はMatchオブジェクトSubMatchesプロパティを通じてアクセス可能です。

      SubMatchesコレクションを見てみる

正規表現の主要メソッド

正規表現オブジェクトには、主に3つの重要なメソッドがあります。
これらを活用することで、検索結果の取得や文字列の置換が簡単に行えるようになります。

スクロールできます
メソッド説明使用例
Testパターンに一致する文字列が存在する場合に True を返します。
一致しない場合は False を返します。
isMatch = regEx.Test("今日は2025年1月9日です。")
Executeパターンに一致するすべての部分を検索し、Matchesコレクションを返します。Set matches = regEx.Execute("2025年1月9日です")
Replace一致した部分を指定した文字列に置換し、置換後の文字列を返します。resultString = regEx.Replace("123", "[数字]")

Matchesコレクションについて

Matchesコレクションは、正規表現のExecuteメソッドを使用した際に返されるオブジェクトです。
これは、一致した部分をすべて格納したコレクションであり、各要素はMatchオブジェクトとして扱われます。

スクロールできます
プロパティ説明使用例
Countコレクション内の一致部分の数を取得します。matches.Count → 2
Item(index)指定したインデックスの一致部分を取得します。matches.Item(0).Value → “2025年1月9日”
For Eachによるループ処理

Matchesコレクションは、For Eachループを使って各要素(Matchオブジェクト)を順に処理できます。

For Each match In matches
    MsgBox "一致した値: " & match.Value
Next

このようにMatchesコレクションからMatchオブジェクトを取り出し、以下のMatchオブジェクトを活用するのが一般的な使い方です。

Matchオブジェクトについて

Matchオブジェクトは、Matchesコレクションの各要素を指し、一致した文字列やその詳細情報を取得するためのプロパティを備えています。

スクロールできます
プロパティ説明使用例
Value一致した文字列を取得します。match.Value → “2025年1月9日”
FirstIndex一致部分の開始位置(0から始まる)。match.FirstIndex → 3
Length一致部分の文字数を取得します。match.Length → 9
SubMatchesサブマッチ(括弧()でグループ化)を取得します。match.SubMatches(0) → “2025”

SubMatchesコレクションについて

SubMatchesコレクションは、正規表現パターンで括弧()を使ってグループ化した部分一致を格納するコレクションです。
これは、Matchオブジェクトのプロパティとして扱われ、一致部分内のさらに詳細な情報を取得するために使用します。

スクロールできます
プロパティ説明使用例
Countコレクション内のサブマッチの数を取得します。match.SubMatches.Count → 3
Item(index)指定したインデックス(0から始まる)のサブマッチを取得します。match.SubMatches(0) → “2025”
SubMatchesコレクションの具体例
サブマッチとは?

サブマッチは、正規表現のパターンで指定されている括弧()で囲まれた部分をインデックスの番号で返します。


補足情報

マッチ・サブマッチの違いについて、今回のコードを用いて解説します。

  • マッチ(全体一致部分)
    • 2025年1月9日
  • サブマッチ(グループ化された部分一致)
    • サブマッチ0 → 2025(年)
    • サブマッチ1 → 1(月)
    • サブマッチ2 → 9(日)
スポンサーリンク

VBAで正規表現を使用する際の注意ポイント

正規表現は非常に便利なツールですが、VBAで使用する際にはいくつかの注意点があります。
これらを事前に理解しておくことで、コードのエラーや想定外の動作を防ぐことができます。

注意1: VBScript.RegExp のオブジェクト作成に注意

VBAで正規表現を使用するためには、「VBScript.RegExp」オブジェクトを作成する必要があります。
ただし、このオブジェクトの作成には2つの方法があり、それぞれメリットとデメリットがあります。

CreateObject と New の違い | メリット・デメリット比較

スクロールできます
使用方法メリットデメリット
CreateObject参照設定が不要ですぐに使える。コード補完(IntelliSense)が使用できない。
New
VBScript_RegExp_55.RegExp
コード補完(IntelliSense)が使用でき、
タイプミスを防げる。
事前に「参照設定」が必要で、設定ミスのリスクがある。

では、どちらを選ぶべき?

  • 初心者や簡単なスクリプトを作成する場合
    • CreateObject を使うのがおすすめです。
      参照設定が不要で、コードがどの環境でも実行しやすいからです。
      • おすすめの理由
        • 別のPCや環境にコードを移動しても、問題なく動作します。
        • 設定の手間が省けるため、VBAを始めたばかりの方にも安心です。
  • 本格的なスクリプトを作成する場合
    • New を使用することで、コード補完(IntelliSense)を活用しながら効率的に作業できます。
      特に、プロジェクトが大規模になる場合やミスを最小限に抑えたい場合には有効です。
      • おすすめの理由
        • プロパティやメソッドの候補が表示されるため、タイプミスを防ぎながら作業できます。
        • 大規模なプロジェクトや、チーム開発での正確性を求められる場合に適しています。

注意2: Globalプロパティの設定に注意しよう

正規表現の検索範囲を制御するGlobalプロパティ の設定は非常に重要です。
この設定によって、「検索結果が 1件だけ取得される」のか、「複数の一致部分をすべて取得できる」のかが変わります。

  • True に設定すると、文字列全体を検索し、すべての一致部分を取得します。
  • False に設定すると、最初に一致した部分だけが取得されます。

検索を行う前に、「全ての一致部分が必要なのか?」を確認して、適切な設定を行いましょう!

正規表現の主要プロパティ(Pattern,-Global,-IgnoreCase)をもう一度みる

regEx.Global = True '// 全体検索を有効にする 

regEx.Global = False '// 最初の一致だけを取得

Global=True / False の違いを簡単に比較

スクロールできます
設定値説明
True文字列全体を検索し、すべての一致部分を取得します。「123abc456def789ghi」 → 一致: 「123」「456」「789」
False最初に一致した部分だけを取得します。「123abc456def789ghi」 → 一致: 「123」

注意3: パフォーマンスに注意しよう(大規模データの処理)

正規表現は柔軟で強力ですが、大量のデータや複雑なパターンを処理する際には、処理速度が低下することがあります。

特に、大規模なデータセットやネストされた正規表現を扱う場合には注意が必要です。

パフォーマンスが低下するケース

  • 大規模なデータセットの処理
    • 例: 数千行以上のデータ(Excelのシート全体など)に対して正規表現を適用する場合。
  • 複雑な正規表現のパターン
    • 例: (a|b|c)* のような冗長なパターンやネストされた括弧を含む正規表現。
  • 動的に変化するデータ
    • 例: 毎回異なるパターンやデータセットに対して正規表現を適用する場合。

解決策: パフォーマンス向上のための工夫

スクロールできます
方法説明
正規表現パターンを簡潔にする冗長な表現やネストされた括弧を避け、効率的なパターンを使用します。
処理を分割するデータを小さなチャンク(例: 1000行ずつ)に分割して処理することで、負荷を軽減します。
配列にデータを一括で読み込むExcelのセル範囲を直接操作するのではなく、一度配列に読み込むことで処理速度を向上させます。
必要なデータを事前にフィルタリングする正規表現を適用する前に、対象データを条件付きでフィルタリングして不要な処理を省きます。
テストデータで確認するまず少量のデータで処理結果を確認し、その後大規模なデータに適用します。

コード例: 配列を使った効率的な処理

以下のコードは、大量データを「配列」に読み込み、処理する方法を示した例です。
配列を使用することで、セルを直接操作するよりも高速な処理が可能になります。

Sub RegexWithArray()
    Dim regEx As Object
    Dim dataArray As Variant
    Dim matches As Object
    Dim i As Long

    '// 正規表現オブジェクトの作成
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Pattern = "\d+"      '// 数字を検索
    regEx.Global = True        '// 全体検索を有効にする

    '// データを配列に読み込む(A列のデータを取得)
    dataArray = Sheet1.Range("A1:A10000").Value

    '// 配列をループで処理
    For i = 1 To UBound(dataArray, 1)
        If Not IsEmpty(dataArray(i, 1)) Then
            If regEx.Test(dataArray(i, 1)) Then
                '// 一致部分を取得
                Set matches = regEx.Execute(dataArray(i, 1))
                Debug.Print "セル A" & i & ": " & matches(0).Value
            End If
        End If
    Next i
End Sub
コードのポイント解説
  • 配列を使用する理由
    • Excelのセルを直接操作するよりも、配列を操作する方が処理速度が速いです。
  • 小さなデータ単位で処理
    • 必要に応じて範囲を分割し、小さなチャンクに分けて処理することで、負荷を軽減できます。
  • 結果の確認方法
    • 大規模なデータを扱う前に、まず少量のデータで正確に動作することを確認しましょう。

事前に条件付きでデータをフィルタリング

事前に特定の条件でデータをフィルタリングし、正規表現の処理対象を絞る方法です。
たとえば、「特定の列に数字が含まれる行だけを処理する」などが可能です。

Sub RegexWithFilteredData()
    Dim regEx As Object
    Dim matches As Object
    Dim filteredRange As Range
    Dim cell As Range

    '// 正規表現オブジェクトの作成
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Pattern = "\d+"      '// 数字を検索
    regEx.Global = True        '// 全体検索を有効にする

    '// A列に数字を含む行をフィルタリング
    With Sheet1
        .AutoFilterMode = False '// 既存のフィルターを解除
        .Range("A1:A1000").AutoFilter Field:=1, Criteria1:="=*#*" '// 条件付きフィルターを適用(# は数字を表すプレースホルダー)
        On Error Resume Next
        Set filteredRange = .Range("A2:A1000").SpecialCells(xlCellTypeVisible) '// フィルタリング後の可視セルを取得
        On Error GoTo 0
    End With

    '// フィルタリング後の範囲を処理
    If Not filteredRange Is Nothing Then
        For Each cell In filteredRange
            If regEx.Test(cell.Value) Then
                MsgBox "一致: " & regEx.Execute(cell.Value)(0).Value
            End If
        Next cell
    End If

    '// フィルターを解除
    Sheet1.AutoFilterMode = False
End Sub
コードのポイント解説
  • フィルタリングで無駄なセルを処理しない
    • 事前に対象を絞り込むことで、無駄なセルを処理せずに済みます。
      たとえば、数字が含まれないセルには正規表現を適用しません。
  • 可視セルのみを処理
    • SpecialCells(xlCellTypeVisible) を使うことで、フィルタリングされた範囲内の可視セルだけを対象としています。
      これにより、Excelのフィルター機能を活用した効率的な処理が可能です。
  • ユーザーが指定した条件に対応可能
    • AutoFilterCriteria1 プロパティを調整すれば、数字以外の特定の条件にも対応可能です。

注意4: エスケープ文字に注意しよう

正規表現では、特定の記号(例: ., *, +, ^, $ など)が特別な意味を持ちます。
これらの記号を「文字列そのもの」として検索したい場合、エスケープ処理が必要です。

エスケープ文字とは?

エスケープ文字とは、特殊な意味を持つ記号を「そのままの文字」として扱うための方法です。

例えば、「.」(ピリオド)は正規表現では「任意の1文字」を表しますが、「ピリオドそのもの」を検索したい場合があります。
このとき、バックスラッシュ(\)を付けて「\.」と記述することで、ピリオドそのものを検索することができます。

記号通常の意味エスケープした場合の意味
.任意の1文字を表すピリオド(.)そのものを意味する
\エスケープ文字として使用されるバックスラッシュ(\)そのもの
*直前の文字が0回以上繰り返すアスタリスク(*)そのもの

コード例

Sub RegexEscapeExample()
    Dim regEx As Object
    Dim testString As String
    
    '// 正規表現オブジェクトの作成
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Pattern = "\." '// ピリオドそのものを検索
    regEx.Global = True  '// 全体検索を有効にする
    
    '// 検索対象文字列
    testString = "abc.def"
    
    '// 一致部分を確認
    If regEx.Test(testString) Then
        MsgBox "ピリオドが見つかりました!"
    Else
        MsgBox "ピリオドは見つかりませんでした。"
    End If
End Sub
スポンサーリンク

VBAで正規表現を使用する例をご紹介

ここでは、実際にVBAで正規表現を操作するためのコード例を紹介します。

以下に紹介する使用例は、すべてコピペしてすぐに実行できるコードです。
気になる例は、ぜひご覧いただき、実際に実行してみてください。

VBAの基礎から応用までを効率よくしっかり学習したい方には、UdemyのVBA講座もおすすめです。

特に自己学習で進める場合、ビデオや実践例があると理解が進みやすくなります。

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べるVBA講座はこちら  /

使用例1: 日付形式のデータを抽出

このコードでは、テキストデータの中から日付形式(例: “2025/01/17″)を抽出し、その結果をデバッグウィンドウに表示します。

正規表現を使用することで、柔軟かつ簡単に日付データを検索することが可能です。

コード例 | 日付形式の抽出

Sub ExtractDates()
    Dim regEx As Object
    Dim matches As Object
    Dim testString As String
    Dim match As Object

    '// 正規表現オブジェクトの作成
    Set regEx = CreateObject("VBScript.RegExp")
    
    '// 検索対象の文字列
    testString = "イベントの日程は2025/01/17と2025/02/20です。締切は2025/03/15です。"
    
    '// 正規表現パターンの設定(YYYY/MM/DD形式の日付を検索)
    regEx.Pattern = "\d{4}/\d{1,2}/\d{1,2}"
    regEx.Global = True    '// 全体検索を有効にする
    
    '// 正規表現の実行
    Set matches = regEx.Execute(testString)
    
    '// 一致部分をループで確認
    For Each match In matches
        Debug.Print "一致した日付: " & match.Value
    Next match
End Sub

処理結果

使用例1結果

コードの動作概要

STEP
正規表現オブジェクトの作成

正規表現を扱うためのオブジェクトを作成します。

STEP
検索対象文字列の設定

日付を含む文字列を testString に設定します。

STEP
正規表現パターンの指定

\d{4}/\d{1,2}/\d{1,2} を指定することで、4桁の数字(年)、スラッシュ(/)、1~2桁の数字(月・日)というパターンを検索します。

STEP
一致部分の検索

Execute メソッドを使用して、文字列中の一致部分をすべて取得します。

STEP
検索結果の出力

一致した日付データをデバッグウィンドウに出力します。

このコードで使用している機能

機能名説明
CreateObjectVBScript.RegExp オブジェクトを作成します。
Pattern正規表現パターンを指定します。
GlobalTrue に設定することで、文字列全体を検索し、すべての一致部分を取得します。
Execute正規表現を実行し、一致部分を含む Matches コレクションを返します。
For EachMatches コレクション内の要素(Matchオブジェクト)を順に処理します。
Debug.Print一致したデータをデバッグウィンドウに出力します。

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub ExtractDates()
    • サブルーチン「ExtractDates」を定義します。
      このサブルーチンでは、日付形式のデータを抽出します。
  2. Dim regEx As Object
    • 「regEx」: 正規表現オブジェクトを格納します。
  3. Dim matches As Object
    • 「matches」: 正規表現に一致した部分を格納するコレクションです。
  4. Dim testString As String
    • 「testString」: 検索対象の文字列を格納します。
  5. Dim match As Object
    • 「match」: Matchesコレクションの各要素(Matchオブジェクト)を格納します。
  6. Set regEx = CreateObject(“VBScript.RegExp”)
    • 「VBScript.RegExpオブジェクト」を作成します。
  7. testString = “イベントの日程は2025/01/17と2025/02/20です。締切は2025/03/15です。”
    • 検索対象となる文字列を設定します。
  8. regEx.Pattern = “\d{4}/\d{1,2}/\d{1,2}”
    • 正規表現パターンを設定します。
      • \d{4}: 4桁の数字(年)を表します。
      • /: スラッシュを表します。
      • \d{1,2}: 1桁または2桁の数字(月または日)を表します。
  9. regEx.Global = True
    • 全体検索を有効にすることで、すべての一致部分を取得できるようにします。
  10. Set matches = regEx.Execute(testString)
    • 正規表現を実行し、一致部分を Matchesコレクションとして取得します。
  11. For Each match In matches
    • Matchesコレクション内の各要素(Matchオブジェクト)を順に処理します。
  12. Debug.Print “一致した日付: ” & match.Value
    • 一致した部分(Matchオブジェクトの Valueプロパティ)をデバッグウィンドウに出力します。
  13. Next match
    • 次の一致部分を処理します。
  14. End Sub
    • マクロの終了を示します。

総括・ポイント

このコードは、正規表現を使用して「日付形式」のデータを簡単に抽出する方法を示しています。
検索対象を柔軟に変更することで、他の形式(例: 2025-01-1701/17/2025)にも対応可能です。

ポイント
  • 正規表現のパターンを正確に指定することが重要です。
  • Global プロパティを使用して、複数の一致部分を取得する場合と、1つだけ取得する場合を使い分けましょう。

使用例2: 特定の電話番号形式を抽出して別のセルに書き出し

このコードでは、セル範囲(A2~A10)に記載された電話番号の中から、特定の形式(例: “080” または “090” で始まる番号)を抽出し、B列に記載します。

正規表現を使うことで、柔軟に条件を設定して必要なデータを取り出すことが可能です。

コード例 | 特定の電話番号を抽出して書き出し

Sub ExtractPhoneNumbers()
    Dim regEx As Object
    Dim matches As Object
    Dim cell As Range
    Dim ws As Worksheet
    Dim outputRow As Long

    '// ワークシートの設定
    Set ws = ThisWorkbook.Sheets(1) '// 対象のシートを指定

    '// 正規表現オブジェクトの作成
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Pattern = "^(080|090)-\d{4}-\d{4}$" '// 電話番号形式を検索
    regEx.Global = True '// 全体検索を有効にする

    '// 出力先の初期位置を指定
    outputRow = 2 '// B列の2行目から書き出し

    '// A2:A10の範囲をループ
    For Each cell In ws.Range("A2:A10")
        If Not IsEmpty(cell.Value) Then '// セルが空でない場合
            If regEx.Test(cell.Value) Then
                '// 一致した電話番号をB列に書き出し
                ws.Cells(outputRow, 2).Value = cell.Value
                outputRow = outputRow + 1 '// 次の行に進む
            End If
        End If
    Next cell
End Sub

処理結果

使用例2の結果

コードの動作概要

STEP
正規表現の設定

パターン ^(080|090)-\d{4}-\d{4}$ を設定して、「080」または「090」で始まり、後ろにハイフン区切りで4桁の数字が2回続く形式を検索します。

STEP
セル範囲をループ

A列の2行目から10行目までをループ処理して、各セルの値を正規表現で検証します。

STEP
一致した電話番号の書き出し

一致した電話番号を B列の対応する行に記載します。

STEP
出力位置の調整

抽出した電話番号を記載するための行を管理し、B列の次の行に結果を書き出します。

このコードで使用している機能

機能名説明
CreateObjectVBScript.RegExp オブジェクトを作成します。
Pattern正規表現パターンを指定します。「^(080
Global全体検索を有効にします。
Test正規表現パターンに一致するかどうかを判定します。
一致する場合は True を返します。
IsEmptyセルが空であるかどうかを判定します。
For Each指定された範囲内のすべてのセルを順に処理します。
Cells(row, col)指定された行と列のセルにアクセスします。

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub ExtractPhoneNumbers()
    • サブルーチン「ExtractPhoneNumbers」を定義します。
      このサブルーチンでは、特定の電話番号形式を抽出して別のセルに書き出します。
  2. Dim regEx As Object
    • 「regEx」: 正規表現オブジェクトを格納します。
  3. Dim matches As Object
    • 「matches」: 一致した部分を格納するコレクション(今回は使用しませんが構造的に含めています)。
  4. Dim cell As Range
    • 「cell」: 処理対象のセルを格納します。
  5. Dim ws As Worksheet
    • 「ws」: 処理対象のワークシートを指定します。
  6. Dim outputRow As Long
    • 「outputRow」: 抽出結果を記載する B列の行番号を管理します。
  7. Set ws = ThisWorkbook.Sheets(1)
    • 処理対象のワークシートを指定します。
  8. Set regEx = CreateObject(“VBScript.RegExp”)
    • 「VBScript.RegExpオブジェクト」を作成します。
  9. regEx.Pattern = “^(080|090)-\d{4}-\d{4}$”
    • 正規表現オブジェクトを作成し、パターンを設定します。
      • ^(080|090): 文字列の先頭が「080」または「090」であることを指定します。
      • -\d{4}: ハイフンに続いて4桁の数字があることを指定します。
      • -\d{4}$: 再びハイフンと4桁の数字で終わることを指定します。
  10. regEx.Global = True
    • 全体検索を有効にすることで、すべての一致部分を取得できるようにします。
  11. outputRow = 2
    • 抽出結果を書き出す B列の行番号を初期化します。
  12. For Each cell In ws.Range(“A2:A10”)
    • A列の2行目から10行目までを順番に処理します。
  13. If Not IsEmpty(cell.Value) Then
    • セルが空でない場合のみ処理を進めます。
  14. If regEx.Test(cell.Value) Then
    • セルの値が正規表現パターンに一致するかどうかを判定します。
  15. ws.Cells(outputRow, 2).Value = cell.Value
    • 一致した場合、電話番号を B列に記載します。
  16. outputRow = outputRow + 1
    • 変数「outputRow」を、次の行に進むように行番号を更新します。
  17. Enf If
    • ifを終了します。
  18. Enf If
    • ifを終了します。
  19. Next cell
    • 次のセルに進みます。
  20. End Sub
    • マクロの終了を示します。

総括・ポイント

このコードは、特定の形式(080または090で始まる電話番号)を抽出し、別のセルに書き出す実務的な例です。
正規表現を活用することで、電話番号のフォーマットを柔軟に変更して対応できます。

ポイント
  • 出力先のセル(B列)を明示的に管理することで、結果が適切に記載されます。
  • パターンを簡単に変更することで、他の形式にも対応可能です(例: 「070」や「固定電話番号」)。

使用例3: 一致した部分の文字を赤色に変更する

このコードでは、A列の特定範囲(A2~A10)内で「080」で始まる電話番号を検索し、一致した部分の文字だけを赤色に変更します。

正規表現とVBAのCharactersプロパティを組み合わせることで、セル内の特定部分の書式を柔軟に変更できます。

コード例 | 一致部分の文字色を変更する

Sub ChangeColorForMatchedText()
    Dim regEx As Object
    Dim matches As Object
    Dim match As Object
    Dim cell As Range
    Dim ws As Worksheet
    Dim startPos As Long
    Dim matchLength As Long

    '// ワークシートの設定
    Set ws = ThisWorkbook.Sheets(1) '// 処理対象のシートを指定

    '// 正規表現オブジェクトの作成
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Pattern = "(080)" '// 電話番号が「080」で始まる箇所を指定
    regEx.Global = True '// 全体検索を有効にする

    '// A2:A10の範囲をループ
    For Each cell In ws.Range("A2:A10")
        If Not IsEmpty(cell.Value) Then '// セルが空でない場合
            If regEx.Test(cell.Value) Then
                '// 一致部分を取得
                Set matches = regEx.Execute(cell.Value)

                '// 各一致部分を処理
                For Each match In matches
                    startPos = match.FirstIndex + 1 '// 一致部分の開始位置(1始まり)
                    matchLength = match.Length '// 一致部分の長さ

                    '// マッチした部分の文字色を変更
                    cell.Characters(startPos, matchLength).Font.Color = RGB(255, 0, 0) '// 赤色
                Next match
            End If
        End If
    Next cell
End Sub

処理結果

使用例3結果

コードの動作概要

STEP
正規表現の設定

パターン(080)を設定して、「080」で始まる部分を検索します。

STEP
セル範囲をループ

A列の2行目から10行目までをループ処理し、各セルの値を正規表現で検証します。

STEP
一致部分の取得

一致部分をmatchesコレクションに格納し、ループで各一致部分を処理します。

STEP
一致部分の書式変更

Charactersプロパティを使用して、一致部分の文字色を赤色(RGB(255, 0, 0))に変更します。

このコードで使用している機能

スクロールできます
機能名説明
CreateObjectVBScript.RegExp オブジェクトを作成します。
Pattern正規表現パターンを指定します。「(080)」を指定して080部分を検索します。
Global全体検索を有効にします。
Test正規表現パターンに一致するかどうかを判定します。一致する場合は True を返します。
Execute正規表現パターンに一致するすべての部分を検索し、Matchesコレクションとして返します。
Charactersセル内の特定範囲の文字列にアクセスし、そのフォントやスタイルを変更します。
Font.Color指定した文字列の色を変更します(RGB関数を使用)。
FirstIndex一致部分の開始位置を取得します(0始まり)。
Length一致部分の文字数を取得します。

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub ChangeColorForMatchedText()
    • サブルーチン「ChangeColorForMatchedText」を定義します。
      このサブルーチンでは、正規表現に一致した部分の文字色を変更します。
  2. Dim regEx As Object
    • 「regEx」: 正規表現オブジェクトを格納します。
  3. Dim matches As Object
    • 「matches」: 一致部分(Matchesコレクション)を格納します。
  4. Dim match As Object
    • 「match」: 一致した各部分を表すオブジェクト。
  5. Dim cell As Range
    • 「cell」: 処理対象のセルを格納します。
  6. Dim ws As Worksheet
    • 「ws」: 処理対象のワークシートを指定します。
  7. Dim startPos As Long
    • 「startPos」: 一致部分の開始位置(1始まり)。
  8. Dim matchLength As Long
    • 「matchLength」: 一致部分の文字数。
  9. Set ws = ThisWorkbook.Sheets(1)
    • 処理対象のワークシートを指定します。
  10. Set regEx = CreateObject(“VBScript.RegExp”)
    • 「VBScript.RegExpオブジェクト」を作成します。
  11. regEx.Pattern = “(080)”
    • 正規表現オブジェクトを作成し、パターンを設定します。
      • Pattern: 「080」で始まる部分を検索する正規表現パターン。
  12. regEx.Global = True
    • 全体検索を有効にすることで、すべての一致部分を取得できるようにします。
  13. For Each cell In ws.Range(“A2:A10”)
    • A列の2行目から10行目までを順番に処理します。
  14. If Not IsEmpty(cell.Value) Then
    • セルが空でない場合のみ処理を進めます。
  15. If regEx.Test(cell.Value) Then
    • セルの値が正規表現パターンに一致するかどうかを判定します。
  16. Set matches = regEx.Execute(cell.Value)
    • 一致部分を Matches コレクションとして取得します。
  17. For Each match In matches
    • Matchesコレクション内の各要素(Matchオブジェクト)を順に処理します。
  18. startPos = match.FirstIndex + 1
    • 「FirstIndex」: 一致部分の開始位置(1始まり)。
  19. matchLength = match.Length
    • 「Length」: 一致部分の文字数
  20. cell.Characters(startPos, matchLength).Font.Color = RGB(255, 0, 0)
    • 「Characters」: 一致部分の文字色を赤色に変更します。
  21. Next match
    • 次のセルに進みます。
  22. Enf If
    • ifを終了します。
  23. Enf If
    • ifを終了します。
  24. Next cell
    • 次のセルに進みます。
  25. End Sub
    • マクロの終了を示します。

総括・ポイント

このコードは、特定の文字列部分だけを色付けする実用的な例です。

正規表現とCharactersプロパティを活用することで、部分的な書式変更が可能になります。

ポイント
  • パターンを変更することで、他の文字列(例: 「090」や特定の単語)にも応用可能です。
  • Charactersプロパティを使うことで、セル全体ではなく、一致部分のみを柔軟に操作できます。
スポンサーリンク

VBAで正規表現を簡単に使える!汎用テンプレート付き

VBAで正規表現を使用する際に、基本的な処理を簡単に実装できる汎用的なテンプレートを以下に記載します。
このテンプレートをもとに、正規表現を用いた検索・抽出・置換など、さまざまな処理を柔軟にカスタマイズしましょう。

汎用テンプレート|セル範囲を検索する場合

Sub RegexTemplate()
    Dim regEx As Object
    Dim matches As Object
    Dim match As Object
    Dim targetRange As Range
    Dim cell As Range

    '// 正規表現オブジェクトの作成
    Set regEx = CreateObject("VBScript.RegExp")
    
    '// 正規表現の設定(パターンを自由に変更してください)
    regEx.Pattern = "\d+"          '// 数字を検索
    regEx.Global = True            '// 全体検索を有効にする
    regEx.IgnoreCase = True        '// 大文字小文字を区別しない

    '// 検索対象範囲の設定(必要に応じて変更してください)
    Set targetRange = ThisWorkbook.Sheets(1).Range("A2:A100")

    '// 各セルをループして正規表現を適用
    For Each cell In targetRange
        If Not IsEmpty(cell.Value) Then
            If regEx.Test(cell.Value) Then
                '// 一致部分を取得
                Set matches = regEx.Execute(cell.Value)

                '// 一致した内容をデバッグウィンドウに出力(必要に応じてカスタマイズ)
                For Each match In matches
                    Debug.Print "セル: " & cell.Address & " 一致部分: " & match.Value
                Next match
            End If
        End If
    Next cell

    '// 後処理(必要なら追記)
    Set regEx = Nothing
End Sub
テンプレートの使い方
  • 正規表現パターンの設定
  • 検索対象範囲の設定
    • targetRange に検索対象とするセル範囲を指定します。
      必要に応じて、シート名や範囲を変更してください。
  • カスタマイズ例
    • 一致した部分をハイライトする:cell.Font.Color = RGB(255, 0, 0)
    • 一致部分を別のシートに出力する:Sheets(2).Cells(i, 1).Value = match.Value

この記事のまとめ

この記事では、VBAで正規表現を活用する方法を基礎から応用例まで詳しく解説しました。

正規表現は、文字列の検索・抽出・置換を効率的に行うための強力なツールです。VBAで正規表現を使いこなせるようになることで、業務効率が飛躍的に向上します。

ポイントのおさらい

さらに学ぶために

正規表現は、文字列の検索・置換だけでなく、大量データ処理やデータのクリーニングなど、幅広い場面で活躍します。
今回紹介した内容を参考に、ぜひ実際の業務で正規表現を活用してください。

また、VBAの基礎や応用をさらに深く学びたい方には、以下の記事もおすすめです。

あわせて読みたい
サイトマップ このページは、本サイトの記事を分かりやすくまとめました。ぜひご覧ください。 目次 「VBA」を見る 「Officeスクリプト」を見る 「ワークシート関数」を見る 「JavaScr...
スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次