VBAで文字列を検索するとき、「条件に一致するかどうかだけを判定したい」と思ったことはありませんか。
例えば、メールアドレスの形式が正しいか、郵便番号の入力ルールを満たしているか、商品コードが決められた形式になっているかなど、一致した文字列を取得するのではなく、条件を満たしているかだけを確認したい場面は少なくありません。
そのような場合に活躍するのが、正規表現(RegExp)のTestメソッドです。
この記事では、Testメソッドの基本的な使い方から、Executeメソッドとの違い、実務で保守しやすいコードの書き方まで詳しく解説します。
✅ Testメソッドとは
正規表現には、Test・Execute・Replaceなど複数のメソッドがあります。それぞれ役割が異なるため、用途に応じて使い分けることが重要です。実務では、「一致しているかどうかだけを確認したい」というケースが多く、毎回Executeメソッドを使うとコードが複雑になることがあります。この章では、Testメソッドの役割を理解し、適切な利用場面を確認していきましょう。
・Testメソッドの役割
Testメソッドは、指定した文字列が検索条件に一致するかどうかを判定するメソッドです。
戻り値は真偽値(Boolean)となり、
- 一致した場合:
True - 一致しなかった場合:
False
が返されます。
そのため、If文との組み合わせで利用されることが非常に多いメソッドです。
・Executeメソッドとの違い
Testメソッドは一致判定だけを行います。
一方、Executeメソッドは一致した文字列そのものを取得します。
つまり、
- 一致するかだけ知りたい → Test
- 一致した内容を取得したい → Execute
という使い分けになります。
一致判定だけで十分な場合は、Testメソッドを利用した方がシンプルで分かりやすいコードになります。
一致した文字列そのものを取得したい場合は、Executeメソッドを利用します。MatchCollectionの扱い方や実務での活用方法については、【VBA】正規表現:Executeメソッドの使い方で詳しく解説しています。
・実務ではどんな場面で使う?
Testメソッドは、次のような場面でよく利用されます。
- メールアドレスの入力チェック
- 郵便番号の形式チェック
- 商品コードの判定
- ファイル名の確認
- 社員番号の入力チェック
入力内容がルールどおりかどうかを判定する処理では、特に活躍します。
単純な部分一致だけで十分な場合は、Like演算子やInStr関数を利用した方がシンプルに実装できます。それぞれの使い分けについては、【VBA】文字列の部分一致(IF文)|LikeとInStrで壊れない条件分岐を設計するも参考にしてください。
✅ Testメソッドの基本的な使い方
Testメソッドを利用する場合は、RegExpオブジェクトを作成し、検索条件(Pattern)を設定してから判定を行います。ここで重要なのは、「検索条件」と「判定処理」を分離して記述することです。実務では検索条件だけ変更するケースが多いため、このような構成にしておくと保守しやすくなります。
・基本的なコード
ここでは、郵便番号の形式を判定する例を紹介します。
検索対象と検索条件を分けて管理することで、後からPatternだけ変更しやすい構成にしています。
Sub CheckPostalCode()
' 正規表現オブジェクト
Dim regularExpression As Object
' 判定対象の文字列
Dim targetText As String
' 判定対象
targetText = "123-4567"
' RegExpを生成
Set regularExpression = CreateObject("VBScript.RegExp")
With regularExpression
' 郵便番号形式
.Pattern = "^\d{3}-\d{4}$"
' 大文字・小文字を区別しない
.IgnoreCase = True
' 最初の一致だけ判定
.Global = False
End With
If regularExpression.Test(targetText) Then
MsgBox "郵便番号です。"
Else
MsgBox "郵便番号ではありません。"
End If
End Sub
Testメソッドは、Patternプロパティで指定した検索条件をもとに一致判定を行います。正規表現の書き方やパターン指定について詳しく知りたい方は、【VBA】正規表現:Patternプロパティの使い方もあわせてご覧ください。
・なぜこの書き方にしているのか
このコードでは、
- RegExpオブジェクト
- 検索条件
- 判定対象
- 判定処理
を分けて記述しています。
このように役割を分離すると、
- Patternだけ変更できる
- 判定対象だけ変更できる
- 同じRegExpを使い回せる
- コードの流れが分かりやすい
というメリットがあります。
また、regularExpressionやtargetTextのように意味が分かる変数名を使用することで、後からコードを見直した場合でも内容を理解しやすくなります。
・実務で注意したいポイント
Testメソッドは一致判定専用です。
一致した文字列を取得したい場合は、Executeメソッドを利用する必要があります。
そのため、
- True / Falseだけ必要 → Test
- 一致したデータも必要 → Execute
という役割を意識して使い分けると、処理が分かりやすくなり、不要なコードも減らせます。
Testメソッドで一致を確認したあと、シート全体のデータをまとめて置換したい場合もあります。実務での置換処理については、【VBA】Excelシート全体の置換を自動化する方法|部分一致・完全一致まで徹底解説も参考にしてください。
✅ Testメソッドを実務で活用する方法
Testメソッドは「一致するかどうか」だけを確認したい場面で非常に便利です。抽出処理が不要な場合でも、入力チェックやファイル名の確認など、業務では多くの判定処理が存在します。ここでは、実務でよくある利用例を紹介します。
・メールアドレスの形式を判定する
入力されたメールアドレスが正しい形式かを確認する場面は少なくありません。
ここでは、入力チェックだけを行うため、Testメソッドを利用します。
Sub CheckEmailAddress()
Dim regularExpression As Object
Dim emailAddress As String
emailAddress = "sample@example.com"
Set regularExpression = CreateObject("VBScript.RegExp")
With regularExpression
' メールアドレス形式
.Pattern = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$"
.IgnoreCase = True
End With
If regularExpression.Test(emailAddress) Then
MsgBox "メールアドレスの形式です。"
Else
MsgBox "メールアドレスの形式ではありません。"
End If
End Sub
InputBoxで受け取った値に対してTestメソッドで入力チェックを行うこともできます。安全な入力制御の方法については、【VBA】InputBoxの活用方法|実務で使える入力制御と安全設計を完全解説も参考にしてください。
・この書き方を採用する理由
このコードでは、検索対象を変数へ格納してから判定しています。
このようにすることで、
- セルの値にも対応しやすい
- InputBoxにも流用できる
- CSVデータにも利用できる
- テストしやすい
というメリットがあります。
また、検索条件(Pattern)と対象データ(emailAddress)が分かれているため、仕様変更にも対応しやすい構成になっています。
・商品コードを判定する
例えば、
ABC-1001
のような商品コードだけを許可したい場合にもTestメソッドは便利です。
抽出する必要がないため、Executeよりもシンプルに記述できます。
✅ TestメソッドとExecuteメソッドの使い分け
正規表現を学び始めると、「TestとExecuteはどちらを使えばよいのか」と迷う方が多くいます。どちらも文字列検索に利用しますが、取得したい結果が異なります。目的に応じて適切に使い分けることで、コードをシンプルに保つことができます。
・一致するかだけ確認したい場合
一致判定だけで十分な場合は、
regularExpression.Test(targetText)
を利用します。
戻り値はTrueまたはFalseなので、If文と非常に相性が良いメソッドです。
・一致した文字列を取得したい場合
一致したデータそのものを利用したい場合は、
regularExpression.Execute(targetText)
を利用します。
メールアドレスや商品コードを一覧で取得する場合はこちらが適しています。
・実務ではどちらを選ぶべきか
目的ごとの使い分けは次のようになります。
| 目的 | 利用するメソッド |
|---|---|
| 一致判定だけ | Test |
| 一致した文字列を取得 | Execute |
| 一致した文字列を置換 | Replace |
必要以上にExecuteを利用すると、不要なオブジェクト生成が増えてコードも複雑になります。
そのため、「判定だけ」であればTestメソッドを選ぶことをおすすめします。
Testメソッドで一致を確認した後、その文字列を置換したい場合はRegExpのReplaceメソッドを利用できます。実務での置換パターンについては、【VBA】文字列の置換を正規表現で行う方法|Replaceでは対応できない実務パターン完全解説をご覧ください。
✅ 実務で注意したいポイント
Testメソッドは非常に便利ですが、検索条件やオブジェクトの管理方法によって、保守性が大きく変わります。ここでは、実務で意識したいポイントを紹介します。
・Patternをコード中へ何度も書かない
同じ検索条件を複数箇所へ書くと、仕様変更時に修正漏れが発生しやすくなります。
そのため、
- Patternをまとめる
- 共通関数化する
などの設計がおすすめです。
・RegExpオブジェクトを使い回す
同じ処理内で何度も
CreateObject("VBScript.RegExp")
を実行するのではなく、
一度生成したオブジェクトを利用する方が、
- コードが短くなる
- 修正しやすい
- 可読性が高くなる
というメリットがあります。
・Testだけで済む処理はExecuteを使わない
一致判定しか行わない場合は、
ExecuteよりTestの方が意図が分かりやすくなります。
コードを読む人も、
「判定だけなのだな」
とすぐ理解できるため、保守性向上にもつながります。
✅ よくある質問
・Testメソッドの戻り値は何ですか?
Boolean型です。
一致した場合はTrue、一致しなかった場合はFalseが返ります。
・Executeとの違いは何ですか?
Testは一致判定だけを行います。
Executeは一致した文字列そのものを取得できます。
・If文以外でも使えますか?
はい。
Boolean値を返すため、変数へ格納して利用することも可能です。
✅ まとめ:Testメソッドを使ってシンプルな一致判定を実現しよう
今回は、正規表現のTestメソッドについて解説しました。
- Testメソッドは一致判定専用のメソッド
- 戻り値はTrueまたはFalse
- Executeよりシンプルに判定処理を書ける
- 入力チェックや商品コード判定など実務で活躍する
- Pattern・検索対象・判定処理を分離すると保守しやすい
Testメソッドを使いこなせるようになると、複雑な文字列判定もシンプルで読みやすいコードにまとめられます。実務では「動けばよい」だけでなく、検索条件を変更しやすい設計や、役割ごとに処理を分離した構成を意識することで、長期的に保守しやすいVBAを作成できるようになります。