VBAで自動化 VBA一覧 セル・値の取得と貼り付け 部分一致

【VBA】Like演算子で部分一致を判定する方法|ワイルドカードの使い方も解説

VBAで文字列を扱っていると、「商品名に特定の文字が含まれているデータだけ処理したい」「ファイル名が特定のパターンに一致するものだけ抽出したい」といった場面があります。

このような部分一致の判定に便利なのがLike演算子です。

Like演算子を使えば、「○○を含む」「○○で始まる」「○○で終わる」といった条件をシンプルに記述できます。また、ワイルドカードを組み合わせることで、柔軟な文字列検索も実現できます。

しかし、

  • =との違いが分からない
  • InStrとどちらを使えばよいか迷う
  • ワイルドカードの書き方が覚えられない

といった悩みを持つ方も少なくありません。

この記事では、Like演算子の基本からワイルドカードの使い方、実務で保守しやすいコードを書くポイントまで詳しく解説します。

✅ VBAでLike演算子を使って部分一致を判定するとは

文字列の判定はVBAで頻繁に行う処理ですが、「一致しているか」だけでなく、「特定の文字を含んでいるか」「決まった形式になっているか」を判定したいケースも多くあります。ここで=演算子だけを使おうとするとコードが複雑になったり、複数の条件を組み合わせる必要が出てきたりします。Like演算子を理解しておくと、こうした判定を簡潔に記述でき、コードの可読性も向上します。まずはLike演算子がどのような場面で使われるのかを確認しましょう。

・Like演算子とは

Like演算子とは、文字列が指定したパターンに一致するかどうかを判定する演算子です。

例えば、

  • 「Excel」を含む
  • 「A」で始まる
  • 「.xlsx」で終わる

といった条件を簡単に記述できます。

戻り値はTrueまたはFalseとなるため、主にIF文と組み合わせて使用します。

・Like演算子が活躍する場面

Like演算子は、実務では次のような処理でよく利用されます。

  • 商品名の部分一致検索
  • ファイル名の判定
  • シート名のチェック
  • メールアドレスの簡易判定
  • 特定の形式のデータを抽出

完全一致では対応できない検索条件でも、Like演算子ならシンプルに記述できます。

・「=」との違い

=は完全一致のみ判定します。

例えば、

If productName = "Excel" Then

では、「Excel」のみ一致します。

一方、Like演算子なら、

If productName Like "*Excel*" Then

となり、

  • Excel入門
  • Excel関数
  • Microsoft Excel

なども一致します。

部分一致を行いたい場合は、Like演算子を使う方が適しています。

✅ Like演算子の基本構文

Like演算子はシンプルな構文ですが、ワイルドカードをどこに配置するかで判定結果が変わります。ワイルドカードの意味を理解しないまま使用すると、期待したデータだけが抽出されず、思わぬ不具合につながることもあります。この章では基本構文と最もよく使うパターンを押さえていきましょう。

・Like演算子の基本構文

基本構文は次のとおりです。

If 判定対象 Like "条件" Then
    '一致した場合の処理
End If

判定対象にはセルの値や変数などを指定します。

条件にはワイルドカードを含めた文字列を記述します。

・実務で保守しやすいコードにする考え方

Like演算子は短く書けるため、ついIF文へ直接記述してしまいがちです。

しかし、実務では判定条件が後から変更されることも少なくありません。

例えば、「Excel」を検索していたものを「Excel」または「VBA」を検索する仕様へ変更するケースもあります。

そのため、判定対象や検索条件を意味の分かる変数へ格納しておくと、修正箇所が分かりやすくなり、保守性も向上します。

次のコードでは、その考え方を取り入れています。

Sub CheckPartialMatch()

    '==========================
    ' 文字列の部分一致を判定するサンプル
    '==========================

    Dim targetText As String
    Dim searchPattern As String

    ' 判定対象
    targetText = "Excel VBA入門"

    ' 検索条件(Excelを含む)
    searchPattern = "*Excel*"

    If targetText Like searchPattern Then
        MsgBox "条件に一致しました。"
    Else
        MsgBox "条件に一致しませんでした。"
    End If

End Sub

このように変数へ役割を持たせることで、

  • 判定対象
  • 検索条件
  • 判定処理

が明確に分かれ、後から仕様変更があっても修正しやすいコードになります。

また、検索条件を変更する場合も変数を書き換えるだけで済むため、複数箇所を修正するリスクを減らせます。

・この書き方を採用するメリット

今回のコードでは、短く書くことよりも「後から変更しやすいこと」を重視しています。

例えば、次のように直接書くことも可能です。

If targetText Like "*Excel*" Then

ただし、この書き方では検索条件が増えた場合や、複数の判定で同じ条件を使う場合に修正漏れが起こりやすくなります。

一方で、検索条件を変数として管理しておけば、仕様変更や流用が容易になり、実務で長く運用するコードにも対応しやすくなります。

Like演算子による部分一致はシンプルですが、条件によってはInStr関数の方が扱いやすい場合もあります。両者の違いや、実務で壊れにくい条件分岐の考え方を詳しく知りたい方は、「LikeとInStrを使った文字列の部分一致判定」もあわせてご覧ください。


✅ Like演算子で使用できるワイルドカード一覧

Like演算子は、ワイルドカードを組み合わせることで柔軟な文字列判定ができます。ただし、「*」と「?」の違いや、「#」「[]」の役割を曖昧なまま使うと、想定より多くの文字列が一致してしまうことがあります。特に実務では、商品コードやファイル名など一定の形式を持つデータを扱うことが多いため、ワイルドカードごとの特徴を理解しておくことが大切です。条件を短く書ける便利さだけでなく、どこまでを一致対象とするかを意識して使い分けましょう。

・複数の文字を表す「*」の使い方

アスタリスク「*」は、0文字以上の任意の文字列を表します。

よく使う書き方は次のとおりです。

条件判定内容
"*Excel*"Excelを含む
"Excel*"Excelで始まる
"*Excel"Excelで終わる

例えば、商品名に「Excel」が含まれているかを確認する場合は、次のように記述します。

If targetText Like "*Excel*" Then
    MsgBox "Excelを含む文字列です。"
End If

部分一致を判定する場合に最もよく使われるワイルドカードです。

・任意の1文字を表す「?」の使い方

疑問符「?」は、任意の1文字を表します。

例えば、次の条件を考えてみましょう。

If productCode Like "A??" Then

この条件では、「A01」「ABC」「A12」など、Aから始まる3文字の文字列が一致します。

一方、「A1」や「A123」は文字数が異なるため一致しません。

文字数が決まっているコードや型番を確認するときに便利です。

・数字1文字を表す「#」の使い方

「#」は、0から9までの数字1文字を表します。

If productCode Like "A##" Then

この場合は、「A01」「A25」などが一致します。

「ABC」のように数字以外が含まれている文字列は一致しません。

任意の1文字を表す「?」よりも条件を限定できるため、商品コードや管理番号の簡易チェックに向いています。

・文字の範囲を指定する「[]」の使い方

角括弧「[]」を使うと、指定した文字のいずれかに一致するかを判定できます。

If targetText Like "[ABC]*" Then

この条件では、A・B・Cのいずれかで始まる文字列が一致します。

範囲を指定することもできます。

If productCode Like "[A-Z]###" Then

この場合、英大文字1文字と数字3文字で構成される文字列が一致します。

コード体系がある程度決まっている業務データでは、形式チェックとして活用できます。

Like演算子のワイルドカードで対応できない複雑な文字列パターンを判定したい場合は、正規表現が選択肢になります。数字や文字数、複数パターンをより細かく指定したい方は、正規表現のPatternプロパティを使った検索条件の設定方法も参考にしてください。


✅ VBAでセルの部分一致を判定する方法

実務では、変数に直接文字列を入れるより、ワークシート上のデータを順番に確認する場面の方が多いでしょう。ただし、処理対象のシートや最終行を明示せずにコードを書くと、別のシートが選択されていた場合に誤った範囲を処理する可能性があります。また、検索文字をコード内へ直接埋め込むと、条件変更のたびにコードを修正しなければなりません。ここでは、処理対象と検索条件を分け、後から流用しやすい構成で部分一致を判定します。

・検索条件と処理対象を分けて変更しやすくする

次の例では、A列の商品名を確認し、「Excel」を含むセルのB列へ「対象」と入力します。

検索文字を定数としてまとめ、対象シートも明示しているため、条件やシート名が変わった場合でも修正箇所を見つけやすい構成です。

Sub MarkPartialMatches()

    Const TARGET_SHEET_NAME As String = "商品一覧"
    Const SEARCH_KEYWORD As String = "Excel"

    Dim targetWorksheet As Worksheet
    Dim lastRow As Long
    Dim currentRow As Long
    Dim productName As String
    Dim searchPattern As String

    Set targetWorksheet = ThisWorkbook.Worksheets(TARGET_SHEET_NAME)

    ' 部分一致用の検索パターンを作成する
    searchPattern = "*" & SEARCH_KEYWORD & "*"

    ' A列を基準に最終行を取得する
    lastRow = targetWorksheet.Cells( _
        targetWorksheet.Rows.Count, "A").End(xlUp).Row

    For currentRow = 2 To lastRow

        productName = CStr(targetWorksheet.Cells(currentRow, "A").Value)

        If productName Like searchPattern Then
            targetWorksheet.Cells(currentRow, "B").Value = "対象"
        Else
            targetWorksheet.Cells(currentRow, "B").ClearContents
        End If

    Next currentRow

End Sub

・短さより処理の役割が見える構成を優先する理由

今回のコードでは、検索条件をSEARCH_KEYWORDへまとめています。

例えば、検索対象を「VBA」へ変更する場合は、定数の値だけを書き換えれば対応できます。また、検索パターンの作成をループの外で行っているため、行ごとに同じ文字列を組み立てる必要がありません。

処理の流れは、次のように整理されています。

  1. 対象シートを取得する
  2. 検索パターンを作成する
  3. データの最終行を取得する
  4. 各行の商品名を確認する
  5. 条件に一致した行へ結果を入力する

1行ずつ短く書くことよりも、どの変数が何を表し、どこを変更すればよいかが分かることを優先しています。

・実務データで見落としやすいポイント

セルには数値、空白、エラー値などが含まれる場合があります。

今回の例ではCStrで文字列へ変換していますが、セルにエラー値が入っていると型変換でエラーになる可能性があります。実際の業務で不規則なデータを扱う場合は、IsError関数で確認してから判定するなどの対策が必要です。

また、B列の既存データを消したくない場合は、ClearContentsを使わず、一致した行だけへ結果を入力する設計に変更してください。

今回はセルを上から順に確認する方法を紹介しましたが、対象セルを直接検索したい場合はFindメソッドも便利です。大量データから一致するセルを探したい方は、Findメソッドで部分一致や複数一致を検索する方法もあわせて確認してみてください。


 

✅ Like演算子でファイル名やシート名を判定する方法

Like演算子は、セルの値だけでなく、ファイル名やシート名の判定にも利用できます。ただし、拡張子や命名規則まで含めて判定する場合は、ワイルドカードの位置を間違えると関係のないデータまで対象になることがあります。特に自動処理では、判定条件が広すぎると誤ったファイルやシートを処理する危険があります。実務では、条件をできるだけ具体的にして、対象範囲を限定することが重要です。

・特定の拡張子を持つファイル名を判定する

Excelブックかどうかを簡易的に判定する場合は、次のように記述できます。

If fileName Like "*.xlsx" Then
    MsgBox "xlsx形式のファイルです。"
End If

末尾に「.xlsx」が付いているファイル名だけが一致します。

マクロ有効ブックも対象にする場合は、別条件を追加します。

If fileName Like "*.xlsx" Or fileName Like "*.xlsm" Then
    MsgBox "Excelブックです。"
End If

対象拡張子が増える場合は、判定処理を関数へ分けると再利用しやすくなります。

・規則に合うシート名を判定する

「売上_2026」「売上_東京」など、「売上_」で始まるシートだけを処理する場合は、次の条件を使えます。

If targetWorksheet.Name Like "売上_*" Then
    ' 対象シートに対する処理
End If

シートを複数作成する業務では、命名規則とLike演算子を組み合わせることで、処理対象を自動的に絞り込めます。

ただし、利用者がシート名を自由に変更できる運用では、命名規則が崩れて処理対象から外れる可能性があります。コードだけでなく、シート名の運用ルールもあわせて整えることが重要です。

ファイル名が条件に一致するか確認するだけでなく、そのまま対象ブックを自動で開きたい場合は、Dir関数などを使ったファイル取得処理へ発展できます。詳しい実装は、ワイルドカードで部分一致するファイルを開く方法で解説しています。


✅ Like演算子とInStr関数の違い

部分一致の判定では、Like演算子だけでなくInStr関数もよく使われます。どちらも文字列を検索できますが、得意な条件は異なります。単純に特定の文字が含まれているか確認するだけなら、どちらを使っても実現可能です。しかし、コードの意図や将来の仕様変更を考えると、条件に合った方法を選ぶことが大切です。

・パターンを判定するならLike演算子

Like演算子は、次のようなパターン判定に向いています。

  • 特定の文字を含む
  • 指定文字で始まる
  • 指定文字で終わる
  • 文字数や数字の形式を確認する
  • 複数候補の文字を指定する

ワイルドカードを使って、文字列全体の形式を判定できる点が強みです。

・文字の位置も取得するならInStr関数

InStr関数は、指定した文字が何文字目にあるかを取得します。

If InStr(1, targetText, "Excel", vbTextCompare) > 0 Then
    MsgBox "Excelを含んでいます。"
End If

含まれているかどうかだけでなく、文字の位置を後続処理で使う場合に適しています。

例えば、検索文字より前後の文字列を切り出す場合は、InStr関数の方が扱いやすいでしょう。

・判定の目的に合わせて選ぶ

単純な包含判定だけを見ると、次の2つは似た結果になります。

targetText Like "*Excel*"
InStr(1, targetText, "Excel", vbTextCompare) > 0

一方、コードを読む人に「指定パターンへ一致するか」を伝えたい場合はLike演算子が分かりやすく、「検索位置を利用する処理」であればInStr関数が適しています。

短さだけで選ぶのではなく、後続処理や判定条件を見て使い分けることが重要です。

InStr関数は、文字列が含まれているかどうかだけでなく、最初に現れる位置も取得できます。検索位置を使って文字列を分割・抽出したい方は、InStr関数で特定の文字位置を取得する方法も参考にしてください。


✅ Like演算子を実務で使う際の注意点

Like演算子は手軽ですが、文字列比較の設定や空白、全角・半角の違いによって判定結果が変わることがあります。テスト用のデータでは正しく動いていても、実際の業務データには余分な空白や表記揺れが含まれているケースが少なくありません。また、検索条件を広くしすぎると、想定外の文字列まで一致します。運用開始後の誤判定を防ぐためにも、実データを想定した確認が必要です。

・大文字と小文字の扱いを確認する

Like演算子の文字列比較は、モジュール先頭に設定するOption Compareの影響を受けます。

Option Compare Text

この設定では、大文字と小文字を区別せずに比較します。

一方、Option Compare Binaryでは、文字コードに基づいて比較されるため、大文字と小文字が区別されます。

モジュールごとに設定が異なると判定結果に差が出る可能性があるため、既存コードへ追加するときはモジュール先頭の設定を確認しましょう。

・余分な空白や表記揺れを考慮する

実務データには、先頭や末尾の空白が含まれていることがあります。

必要に応じて、判定前にTrim関数で余分な空白を取り除きます。

productName = Trim$(CStr(targetWorksheet.Cells(currentRow, "A").Value))

ただし、Trim関数で削除できるのは主に半角スペースです。全角スペースも対象にする場合は、Replace関数を組み合わせる必要があります。

・ワイルドカードを含む文字自体を検索するときは注意する

検索対象の文字列に「*」「?」「#」「[」などが含まれている場合、Like演算子ではワイルドカードとして解釈されます。

これらの記号そのものを検索したい処理では、条件の書き方を慎重に確認する必要があります。単純な文字列として検索したい場合は、InStr関数の方が扱いやすいケースもあります。

Like演算子の判定結果は、モジュールに設定されているOption Compareの影響を受けます。大文字と小文字を区別する条件や、日本語を含む文字列比較で迷わないためにも、Option Compare BinaryとTextの違いを確認しておくと安心です。

1つの検索条件だけでなく、「ExcelまたはVBAを含む」「複数の命名規則に一致する」といった判定が必要な場合は、条件の組み立て方にも注意が必要です。条件が増えても読みやすさを保つ方法は、Like演算子で複数条件を扱う実務設計で詳しく解説しています。


 

✅ まとめ:VBAのLike演算子で部分一致判定を分かりやすく実装しよう

Like演算子を使うと、VBAで文字列の部分一致やパターン判定をシンプルに実装できます。

今回のポイントは次のとおりです。

  • 「*」は0文字以上の任意の文字列を表す
  • 「?」は任意の1文字を表す
  • 「#」は数字1文字を表す
  • 「[]」では文字の候補や範囲を指定できる
  • セル、ファイル名、シート名などの判定に活用できる
  • 検索条件を定数や変数へ分けると変更しやすくなる
  • 文字の位置が必要な場合はInStr関数が適している
  • 大文字・小文字、空白、表記揺れによる誤判定に注意する

Like演算子は、短いコードを書くためだけの機能ではありません。検索条件の意味を明確にし、処理対象や判定条件を分けて設計することで、後から変更しやすく、誤処理の起こりにくいコードにできます。

まずは「特定の文字を含む」「指定文字で始まる」といった身近な判定から取り入れ、実務データの抽出やチェック作業へ活用してみてください。

    -VBAで自動化, VBA一覧, セル・値の取得と貼り付け, 部分一致