「Excelのセルに入力された大量のデータから、電話番号だけを抜き出したい…」
「入力形式がバラバラなメールアドレスを、正しくチェックしたい…」
VBAを使ってデータ処理をしていると、こんな課題にぶつかることはありませんか。
InStr関数やLike演算子でもある程度のことはできますが、条件が複雑になるとコードが長くなりがちです。
そんなときに絶大なパワーを発揮するのが「正規表現」。
この記事では、VBAで正規表現を扱うための基本から、コピペで使える便利なサンプル、さらには応用例まで、分かりやすく解説していきます。正規表現を味方につけて、あなたのVBAスキルをもう一段階レベルアップさせましょう。
VBAで正規表現を使うメリットとは?基本をサクッと解説
まずは「正規表現ってそもそも何?」というところから、簡単におさらいしましょう。VBAに標準で備わっているLike演算子との違いを知ることで、正規表現の便利さがよりクリアに見えてきます。
正規表現ってそもそも何?
正規表現とは、一言でいうと「文字列のパターンを表現するための特殊な書き方のルール」です。
例えば、「数字3桁-数字4桁-数字4桁」という電話番号のパターンを表現したり、「@と.(ドット)が含まれる」というメールアドレスのパターンを表現したりできます。
この「パターン」を一度定義してしまえば、どれだけ大量のデータがあっても、そのパターンに一致する文字列だけを瞬時に見つけ出すことが可能です。
最初は少しとっつきにくい印象があるかもしれませんが、基本的なルールさえ覚えてしまえば、これまで手作業や複雑なコードで対応していた文字列操作が、驚くほどシンプルになります。
Like演算子じゃダメなの?正規表現との違い
VBAには、文字列のパターンマッチングに使える「Like演算子」があります。ワイルドカード(*や?)を使って、簡単なパターン検索ができる便利な機能です。しかし、Like演算子では対応しきれない、より複雑なケースが存在します。
正規表現とLike演算子の違いを比較してみましょう。
項目 | 正規表現 | Like演算子 |
---|---|---|
できること | 複雑なパターンの定義(文字数、文字種、繰り返しなど) | 簡単なパターンの定義(前方一致、後方一致など) |
柔軟性 | 非常に高い。「ハイフンあり/なし」両方の電話番号に対応可能 | 限定的。「ハイフンあり」か「なし」か、どちらかのパターンしか指定できない |
記述方法 | 専用の記法(メタ文字)を使う | ワイルドカード(*, ?, #, − など)を使う |
学習コスト | やや高い | 低い |
例えば、「090-1234-5678」と「09012345678」の両方を電話番号として検出したい場合、Like演算子では別々のパターンで判定する必要があり、コードが煩雑になります。
一方、正規表現なら「ハイフンはあってもなくても良い」という柔軟なパターンを一行で記述できます。これが、正規表現が多くのプログラマーに愛用される大きな理由なのです。
VBAで正規表現を使うための事前準備【2つの方法】
VBAで正規表現のパワーを利用するには、ほんの少しだけ下準備が必要です。
「参照設定」という方法が一般的ですが、環境によっては使えない場合もあるため、もう一つの「CreateObject」を使う方法も合わせてご紹介します。
おすすめは「参照設定」
最もオーソドックスで、多くの場合におすすめなのがこの方法です。一度設定してしまえば、コードを書く際にVBAが入力候補を表示してくれる(インテリセンスが効く)ため、タイプミスを防ぎ、開発効率がぐっと上がります。
設定方法はとても簡単です。
- VBE(Visual Basic Editor)を開きます。(
Alt + F11
で開けます) - メニューバーから「ツール」→「参照設定」をクリックします。
- 一覧の中から「Microsoft VBScript Regular Expressions 5.5」を探し、チェックを入れます。
- 「OK」ボタンをクリックしてダイアログを閉じます。
たったこれだけです。アルファベット順に並んでいるので、スクロールして探してみてください。この設定を行うことで、VBAプロジェクト内で正規表現の機能が使えるようになります。もし複数のバージョンが表示される場合は、数字の大きい(新しい)方を選ぶと良いでしょう。
参照設定なしで使える「CreateObject」
参照設定はPC環境ごとに設定が必要なため、作成したファイルを他の人と共有する際に、相手のPCでエラーが出てしまう可能性があります。
そんなときに便利なのが「CreateObject」関数を使う方法です。
この方法なら、事前の参照設定は一切不要。コード内で直接オブジェクトを生成するため、どんな環境でもエラーなく動作します。
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
このように記述するだけで、正規表現オブジェクトを使えるようになります。
ただし、参照設定をしていないため、コード入力時の予測変換(インテリセンス)が効かないというデメリットがあります。プロパティ名やメソッド名を正確に覚えておく必要がありますが、ファイルの配布性を重視する場合には非常に有効な手段です。
【実践】VBA正規表現の基本的な使い方3ステップ
事前準備が整ったら、いよいよ実際にコードを書いていきましょう。
正規表現の使い方は、たった3つのステップで覚えられます。ここでは、文字列に数字が含まれているかどうかをチェックする簡単なサンプルコードを例に、手順を追って解説します。
Step1: RegExpオブジェクトを用意する
まず、正規表現を扱うための専門家、つまり「RegExpオブジェクト」を準備します。
参照設定をした場合は、以下のように記述します。Dimで変数を宣言し、Newキーワードで新しいインスタンスを生成する、おなじみの書き方です。
Dim re As New RegExp
一方、CreateObjectを使う場合は、先ほども紹介したように以下のように記述します。
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
どちらの方法でも、変数re
が正規表現の機能を持ったオブジェクトとして使えるようになりました。
Step2: 検索パターンを設定する
次に、どんなパターンの文字列を探したいのかを、RegExpオブジェクトに教える必要があります。
これにはPatternプロパティを使います。「数字が1文字以上含まれる」というパターンは、正規表現で\d+と書きます。
re.Pattern = "\d+" ' \dは数字、+は1回以上の繰り返しを意味する
他にも、よく使うプロパティとしてGlobal
とIgnoreCase
があります。
re.Global = True
:文字列全体を検索し、一致するものをすべて探します。(デフォルトはFalseで、最初に見つかったものだけで終了)re.IgnoreCase = True
:大文字と小文字を区別せずに検索します。(デフォルトはFalse)
これらのプロパティも必要に応じて設定しましょう。
Step3: マッチングを実行する
パターンを設定したら、いよいよ実行です。
特定の文字列がパターンに一致するかどうかを単純に知りたい(True/False)場合は、Testメソッドを使います。
Dim targetString As String
targetString = "abc123xyz"
If re.Test(targetString) Then
Debug.Print "文字列に数字が含まれています。"
Else
Debug.Print "文字列に数字は含まれていません。"
End If
このコードを実行すると、targetStringには「123」という数字が含まれているため、イミディエイトウィンドウに「文字列に数字が含まれています。」と表示されます。
このように、「オブジェクト準備 → パターン設定 → 実行」という3つの流れを掴めば、正規表現はもう怖くありません。
コピペで使える!VBA正規表現のパターンサンプル集
理屈は分かっても、正規表現のパターンをゼロから作るのは大変ですよね。
ここでは、実務でよく使うであろうパターンをいくつかサンプルとしてご紹介します。ぜひコピーして、ご自身のコードに活用してみてください。
電話番号を抽出するパターン
ハイフンがあってもなくても、携帯電話(070/080/090)と一般的な固定電話の形式に対応し、ハイフンの有無も吸収できる、より厳密なパターンです。
Sub ExtractPhoneNumber()
Dim re As New RegExp
Dim targetText As String
Dim matches As MatchCollection
Dim match As match
targetText = "会社の電話番号は03-1234-5678で、携帯は09012345678です。無効な番号01-23456-7890も含まれます。"
' 携帯(070/080/090で始まる)と固定電話のパターンを分ける
re.Pattern = "(0[789]0-?\d{4}-?\d{4}|0\d{1,4}-?\d{2,4}-?\d{4})"
re.Global = True ' マッチするものをすべて探す
Set matches = re.Execute(targetText)
For Each match In matches
Debug.Print match.Value ' マッチした文字列を出力
Next
End Sub
' 出力結果:
' 03-1234-5678
' 09012345678
注記:この固定電話のパターンは多くの一般的な形式にマッチしますが、市外局番の桁数と地域の組み合わせなど、日本の電話番号の厳密な規則には完全には準拠していません。本記事では分かりやすさを優先していますが、より高い精度が求められる場合は、さらに詳細なパターン定義が必要です。
郵便番号を抽出するパターン
「〒」マークの有無や、ハイフンの有無に対応したパターンです。データクレンジングなどで役立ちます。
Sub ExtractZipCode()
Dim re As New RegExp
Dim targetText As String
targetText = "住所は〒100-0001 東京都千代田区です。もう一つは1000002です。"
re.Pattern = "\d{3}-?\d{4}" ' 3桁の数字、ハイフン(任意)、4桁の数字
re.Global = True
If re.Test(targetText) Then
For Each match In re.Execute(targetText)
Debug.Print match.Value
Next
End If
End Sub
' 出力結果:
' 100-0001
' 1000002
メールアドレスをチェックするパターン
メールアドレスとして一般的な形式になっているかを検証するパターンです。入力フォームのバリデーションなどに使えます。
Sub ValidateEmail()
Dim re As New RegExp
re.Pattern = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
Debug.Print "test@example.com は " & re.Test("test@example.com") ' True
Debug.Print "test@example は " & re.Test("test@example") ' False
Debug.Print "test.example.com は " & re.Test("test.example.com") ' False
End Sub
このパターンは一般的な形式には対応できますが、完璧ではありません。例えば、user+sub@example.com
のようなサブアドレスや、日本語ドメイン名(test@例.jp
)など、一部の有効なメールアドレスにはマッチしない点にご注意ください。あくまで簡易的なチェックとして利用するのが安全です。
【応用】迷惑メールにも?ニセ警察詐欺の巧妙な手口を見抜く
正規表現の応用範囲は、単なるデータ整理だけにとどまりません。そのパターンマッチング能力は、セキュリティ分野でも応用できる可能性があります。
近年、警察官などを騙って「あなたの口座が犯罪に利用されています」と不安を煽り、口座番号や暗証番号を聞き出そうとする「ニセ警察詐欺」が問題になっています。
こうした詐欺メールやSMSには、特定のパターンが見られることがあります。
例えば、「【緊急】あなたの口座(〇〇銀行 123-456789)が不正利用の疑い…」のように、金融機関名と、いかにもそれらしい口座番号のパターンを含んだ文章で巧妙に誘導してきます。
このようなテキストデータが大量にある場合、正規表現を使えば、特定のパターンの文字列が含まれるメッセージを効率的にフィルタリングできるかもしれません。
Sub DetectSuspiciousText()
Dim re As New RegExp
Dim targetText As String
targetText = "【重要】A銀行の口座(店番123 口座番号4567890)が悪用されています。至急、下記URLから本人確認を。[http://example.fake.com](http://example.fake.com)"
' 「〇〇銀行」や「△△信金」などの後に、数字が続くパターンを検出
re.Pattern = "(銀行|信金|信組)\s?.*?(\d{3,}[-ー]?\d{6,})"
re.Global = False
If re.Test(targetText) Then
MsgBox "詐欺の可能性があるメッセージを検出しました!" & vbCrLf & "ご注意ください。"
End If
End Sub
このコードは、メッセージ内に「銀行」などの単語の後に、口座番号らしい数列(例:3桁-7桁)が含まれている場合に警告を出すサンプルです。
もちろん、これだけで全ての詐欺を防げるわけではありませんし、正規の通知を誤検知する可能性もあります。しかし、正規表現のパターンマッチングというアプローチが、膨大な情報の中から危険な兆候をあぶり出すための一助となり得る、という一例として捉えていただければと思います。
参考:警察を名乗る電話は9割詐欺!偽警察官と本物との見分け方を比較表で解説【ニセ警察詐欺】
正規表現の学習におすすめのツール&サイト
正規表現は強力ですが、その独特な構文に慣れるまでは、パターンを組むのに苦労するかもしれません。
幸い、今では正規表現の学習をサポートしてくれる便利なWebツールがたくさんあります。これらを活用すれば、試行錯誤しながら効率的にスキルを身につけることが可能です。
Rubular
正規表現を学ぶ上で、おそらく最も有名なオンラインツールの一つです。
上部の入力欄に正規表現のパターンを、下部の入力欄にテストしたい文字列を入力すると、リアルタイムでどこにマッチしたのかをハイライト表示してくれます。また、画面下には主要なメタ文字(特殊な意味を持つ記号)のチートシートも用意されており、リファレンスとしても非常に優秀です。まずはこのサイトで色々なパターンを試してみるのが、上達への一番の近道でしょう。
参考:Rubular
Regexper
作成した正規表現のパターンが、一体どのような構造になっているのかを図で可視化してくれるユニークなツールです。
複雑に入り組んだ正規表現でも、その構造を視覚的に理解できるため、他人が書いた難解なパターンを読み解いたり、自分の書いたパターンをデバッグしたりする際に大変役立ちます。文章で理解するのが苦手な方でも、図で見ることで直感的にパターンの意味を掴めるようになるかもしれません。
参考:Regexper
まとめ:VBA×正規表現でデータ処理を自動化しよう
今回は、Excel VBAで正規表現を使うための基本から応用までを解説しました。
- 正規表現は、複雑な文字列パターンを柔軟に扱える強力なツール
- 利用するには「参照設定」か「CreateObject」での事前準備が必要
- 「オブジェクト準備 → パターン設定 → 実行」の3ステップで使える
- 電話番号やメールアドレスなど、実用的なパターンはコピペで活用できる
最初は難しく感じるかもしれませんが、便利なWebツールなどを使いながら少しずつ試していけば、必ずあなたの武器になります。
正規表現を使いこなせるようになると、これまで諦めていたような複雑なデータ処理も自動化の視野に入ってくるはずです。なお、実際の業務で利用する際には、予期せぬエラーに対応するためのエラーハンドリングを組み込むと、より安定したツールになります。ぜひ、日々の業務改善に役立ててみてください。