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

【VBA】ワイルドカードの使い方|Like演算子で部分一致・パターン判定する方法

VBAで文字列やファイル名を扱っていると、「特定の文字を含むデータだけ処理したい」「決まった形式の商品コードだけを抽出したい」といった場面があります。

このような処理で役立つのが、ワイルドカードです。

ワイルドカードを使えば、文字列を完全一致で指定しなくても、特定の文字を含む、指定した文字で始まる、一定の文字数になっているといった条件を表現できます。

VBAでは、主にLike演算子やFindメソッド、Dir関数などでワイルドカードを利用します。ただし、使用する機能によって利用できる記号や意味が異なるため、すべて同じ感覚で使えるわけではありません。

この記事では、Like演算子を中心に、VBAで使用できるワイルドカードの意味と基本的な使い方を解説します。後半では、数字や文字範囲を指定する方法、セルやファイルを対象にした実務的なコードも紹介します。

✅ VBAのワイルドカードとは

ワイルドカードは便利な一方で、「部分一致を表す記号」という曖昧な理解だけで使うと、想定外のデータまで処理してしまうことがあります。例えば、「売上」を含むシートを対象にしたつもりでも、条件の書き方によっては「売上確認用」や「旧売上データ」まで対象になる可能性があります。自動処理では、一件の誤判定が複数のセルやファイルへ影響することもあるため、各記号の意味を正しく理解することが重要です。まずは、ワイルドカードがどのような役割を持つのかを確認しておきましょう。

・文字列の一部を置き換えて条件を表す記号

ワイルドカードとは、文字列の一部を任意の文字として扱うための特殊な記号です。

例えば、次の条件では「Excel」という文字を含むすべての文字列を表します。

"*Excel*"

この条件には、次のような文字列が一致します。

  • Excel入門
  • Excel VBA講座
  • はじめてのExcel
  • Microsoft Excelの使い方

前後のアスタリスク「*」が、Excel以外の文字列を表しています。

・完全一致では対応しにくい条件に向いている

完全一致では、指定した文字列とすべて同じ場合だけ一致します。

If targetText = "Excel" Then

この条件では、「Excel」だけが一致し、「Excel入門」や「Microsoft Excel」は一致しません。

一方、ワイルドカードとLike演算子を組み合わせれば、部分一致を判定できます。

If targetText Like "*Excel*" Then

業務データでは、商品名、担当部署名、ファイル名などに共通する文字だけを基準に処理したいケースが多いため、ワイルドカードが役立ちます。

・VBAでは機能によって使い方が異なる

VBAでは、ワイルドカードを複数の機能で利用できます。

代表的なものは次のとおりです。

使用場所主な用途
Like演算子文字列のパターン判定
Findメソッドセルの検索
Replaceメソッドセル内文字列の置換
Dir関数ファイル名やフォルダ名の取得
AutoFilter条件に合うデータの絞り込み

ただし、Like演算子で使える「#」や文字範囲の指定が、すべての機能で同じように使えるとは限りません。

ワイルドカードを利用するときは、記号の意味だけでなく、どの機能で使うのかも確認する必要があります。


✅ Like演算子でワイルドカードを使う基本構文

Like演算子は、VBAでワイルドカードを学ぶうえで最も基本的な機能です。しかし、検索対象と検索条件をIF文へ直接書き込んでいくと、条件が増えたときにコードの意味が分かりにくくなります。また、同じ検索条件を複数箇所へ記述すると、仕様変更時の修正漏れも起こりやすくなります。実務では、判定対象と検索パターンを分け、どの文字列をどの条件で調べているのかが伝わる構成にすることが大切です。

・Like演算子の基本的な書き方

Like演算子の基本構文は、次のとおりです。

判定する文字列 Like "検索パターン"

判定結果は、条件に一致すればTrue、一致しなければFalseになります。

そのため、通常はIF文と組み合わせて使用します。

If targetText Like searchPattern Then
    ' 条件に一致した場合の処理
End If

検索パターンの中へワイルドカードを指定することで、部分一致や文字数を含めたパターン判定ができます。

・検索条件を変数へ分けて意図を見えやすくする

次のコードでは、「Excel」を含む文字列かどうかを判定します。

検索する文字とワイルドカードを組み合わせた条件を変数へ格納し、判定処理から分けています。

Sub CheckWildcardPattern()

    Dim targetText As String
    Dim searchKeyword As String
    Dim searchPattern As String

    ' 判定対象と検索文字を分けて管理する
    targetText = "Excel VBA実務講座"
    searchKeyword = "Excel"

    ' 前後に任意の文字列を許可する部分一致条件を作成する
    searchPattern = "*" & searchKeyword & "*"

    If targetText Like searchPattern Then
        MsgBox "検索文字を含んでいます。"
    Else
        MsgBox "検索文字は含まれていません。"
    End If

End Sub

・短く書くより検索条件を変更しやすくする理由

次のように、IF文へ検索条件を直接記述することも可能です。

If targetText Like "*Excel*" Then

一度しか使わない短い処理であれば、この書き方でも問題ありません。

しかし、実務では検索文字が後から変更されたり、同じ条件を複数の処理で使用したりすることがあります。検索文字をsearchKeywordへ分けておけば、「Excel」から「VBA」へ変更するときも、検索条件の役割を確認しながら修正できます。

また、searchPatternという変数名から、Like演算子へ渡す条件であることも読み取りやすくなります。

コードを短くすることだけでなく、後から読んだ人が「何を検索しているのか」「どこを変更すればよいのか」を判断できる構成にすることが重要です。

ワイルドカードを使った部分一致はLike演算子で簡潔に書けますが、単純に文字が含まれているかを確認するだけならInStr関数も選択肢になります。両者の違いや、条件分岐を読みやすく設計する方法は、LikeとInStrを使った文字列の部分一致判定で詳しく解説しています。


✅ 「*」で0文字以上の任意の文字列を指定する

アスタリスク「*」は、ワイルドカードの中でも特に使用頻度の高い記号です。ただし、前後のどちらへ配置するかによって、部分一致・前方一致・後方一致の意味が変わります。何となく両側へ付けるだけでは条件が広くなりすぎ、処理対象ではないデータまで一致することがあります。検索したい文字が先頭・途中・末尾のどこにあるのかを整理してから、条件を組み立てましょう。

・特定の文字を含む部分一致

検索文字の前後に「*」を付けると、指定した文字を含む文字列が一致します。

searchPattern = "*Excel*"

一致する例は、次のとおりです。

  • Excel
  • Excel基礎
  • VBAとExcel
  • Microsoft Excel入門

「*」は0文字以上を表すため、「Excel」だけでも一致します。

・指定した文字で始まる前方一致

検索文字の後ろだけに「*」を付けると、指定した文字で始まる文字列が一致します。

searchPattern = "売上_*"

この条件では、次のような文字列が一致します。

  • 売上_東京
  • 売上_大阪
  • 売上_2026年

一方、「月間売上_東京」のように先頭が「売上_」ではない文字列は一致しません。

シート名やファイル名の命名規則を確認する処理に向いています。

・指定した文字で終わる後方一致

検索文字の前だけに「*」を付けると、指定した文字で終わる文字列が一致します。

searchPattern = "*完了"

この条件では、「確認完了」「処理完了」などが一致します。

ただし、「完了済み」は末尾が「完了」ではないため一致しません。

ファイル名の末尾や、処理状況を表す文字列の判定などに利用できます。

Excel」のような部分一致ではなく、文字列全体が同じ場合だけ処理したいときは、ワイルドカードを使わず完全一致で判定します。条件の違いやIF文の組み立て方は、VBAで文字列を完全一致判定する方法も参考にしてください。


✅ 「?」で任意の1文字を指定する

疑問符「?」は、「」と同じ任意の文字を表す記号ですが、対象となる文字数が異なります。「」が0文字以上であるのに対し、「?」は必ず1文字だけに一致します。この違いを理解せずに使うと、桁数の異なる商品コードや管理番号まで一致させてしまう可能性があります。文字数が決まっているデータを判定するときは、「?」の方が条件を具体的にできます。

・決まった文字数のコードを判定する

例えば、Aから始まる3文字のコードを判定する場合は、次のように記述します。

searchPattern = "A??"

一致する例は、次のとおりです。

  • A01
  • ABC
  • Aあ1

「?」は文字の種類を問わず、任意の1文字を表します。

そのため、「Aの後ろに2文字ある」という条件は指定できますが、数字だけに限定することはできません。

・「*」との違いを理解して使い分ける

次の2つは、似ているようで一致範囲が異なります。

"A*"
"A?"

"A*"は、Aだけの文字列や「A001」「ABCDEF」など、Aから始まる任意の長さの文字列に一致します。

一方、"A?"は、Aの後ろに1文字だけある2文字の文字列にしか一致しません。

商品コードや部署コードなど、文字数が仕様として決まっているデータでは、「?」を使うことで誤判定を減らせます。


✅ 「#」で数字1文字を指定する

「#」は、0から9までの数字1文字を表すワイルドカードです。任意の1文字を表す「?」よりも条件を限定できるため、商品コードや管理番号など、数字を含む決まった形式の文字列を判定するときに向いています。ただし、「#」はLike演算子で利用できる記号であり、Findメソッドなどでは同じ意味にならない点に注意が必要です。どの機能で使うかを確認しながら利用しましょう。

・英字と数字を組み合わせたコードを判定する

例えば、Aから始まり、その後ろに数字が2桁続くコードを判定する場合は、次のように記述します。

searchPattern = "A##"

一致する例は、次のとおりです。

  • A01
  • A25
  • A99

一方、次の文字列は一致しません。

  • ABC
  • A1
  • A123

「#」は数字1文字だけを表すため、桁数が決まっているコードの簡易チェックに利用できます。

・「?」よりも条件を具体的にできる

次の条件では、Aの後ろに任意の2文字が続けば一致します。

"A??"

そのため、「ABC」や「Aあ1」も一致します。

一方、次の条件では、Aの後ろに数字が2桁続く場合だけ一致します。

"A##"

コード体系に数字の桁数が定められている場合は、「?」ではなく「#」を使う方が、想定外の文字列を除外しやすくなります。


 

✅ 「[]」で文字の候補や範囲を指定する

角括弧「[]」を使うと、特定の候補や文字範囲の中から1文字を指定できます。例えば、A・B・Cのいずれかで始まる文字列や、英大文字から始まる管理番号を判定できます。「*」や「?」より細かい条件を作れますが、複雑にしすぎると読みづらくなるため、条件の意味がコードから分かるように変数名やコメントを整えることが重要です。

・複数候補のいずれかを指定する

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

searchPattern = "[ABC]*"

一致する例は、次のとおりです。

  • A001
  • B商品
  • C_売上

一方、「D001」は一致しません。

処理対象の区分が複数ある場合に利用できます。

・文字範囲を指定する

ハイフンを使うと、文字の範囲を指定できます。

searchPattern = "[A-Z]###"

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

例えば、次のようなコードです。

  • A001
  • B125
  • Z999

商品番号や社員コードなど、一定の形式を持つデータの判定に向いています。

・一致させたくない文字を指定する

角括弧の中で「!」を使うと、指定した文字以外を表せます。

searchPattern = "[!A]*"

この条件では、A以外の文字から始まる文字列が一致します。

ただし、否定条件は読み間違いが起きやすいため、実務ではコメントを付けるか、条件の意図が伝わる変数名を使用した方が安全です。

Like演算子の「[]」でも文字の候補や範囲を指定できますが、桁数や文字種を組み合わせた複雑な条件では、正規表現の方が適している場合があります。より細かな検索パターンを設定したい方は、正規表現のPatternプロパティを使う方法もあわせてご覧ください。


✅ ワイルドカードでセルの値を部分一致判定する

セルの値を順番に判定する場合は、検索条件だけでなく、対象シートや判定列も明示することが重要です。ActiveSheetやSelectionへ依存したコードでは、利用者が別のシートを開いた状態で実行しただけで誤処理につながる可能性があります。ここでは、対象シートと検索文字を定数で管理し、後から条件を変更しやすい構成で判定します。

・処理対象と検索条件を明確に分ける

次のコードでは、商品一覧シートのA列を確認し、「Excel」を含む行のB列へ「対象」と入力します。

Sub MarkWildcardMatches()

    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 cellText 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

        ' 判定前にセルの値を文字列として取得する
        cellText = CStr(targetWorksheet.Cells(currentRow, "A").Value)

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

    Next currentRow

End Sub

・検索パターンをループの外で作る理由

検索条件はすべての行で同じため、ループの中で毎回作成する必要はありません。

searchPattern = "*" & SEARCH_KEYWORD & "*"

この処理をループの外へ置くことで、処理の役割が分かりやすくなり、不要な繰り返しも避けられます。

また、検索文字を定数として管理しているため、「Excel」から「VBA」へ変更する場合も、修正箇所を探しやすくなります。

・実務で使うときに確認したい点

対象列にエラー値が含まれている場合、CStrで変換するとエラーになる可能性があります。

実際のデータに数式エラーが含まれる可能性がある場合は、次のように確認してから判定します。

If Not IsError(targetWorksheet.Cells(currentRow, "A").Value) Then
    cellText = CStr(targetWorksheet.Cells(currentRow, "A").Value)
End If

また、B列に既存データがある場合は、ClearContentsで消してよいかも事前に確認が必要です。処理結果を書き込む専用列を用意する方が安全な場合もあります。

今回はセルを1行ずつ確認して部分一致を判定しましたが、条件に一致するセルの位置を直接取得したい場合はFindメソッドが便利です。大量のセルから対象を検索する方法は、Findメソッドで部分一致・複数一致を検索する方法で詳しく解説しています。


✅ Dir関数でワイルドカードに一致するファイルを取得する

ワイルドカードは、文字列判定だけでなくファイル取得にも利用できます。Dir関数と組み合わせると、指定フォルダ内から特定の名前や拡張子に一致するファイルを取得できます。ただし、条件が広すぎると意図しないファイルまで対象になるため、フォルダパスや拡張子を明確に指定することが重要です。

・指定した拡張子のファイルを取得する

次のコードでは、指定フォルダ内から最初に見つかったxlsxファイルを取得します。

Sub FindExcelFile()

    Const TARGET_FOLDER_PATH As String = "C:\業務データ\"

    Dim fileName As String
    Dim searchPattern As String

    ' xlsxファイルだけを対象にする
    searchPattern = TARGET_FOLDER_PATH & "*.xlsx"

    fileName = Dir(searchPattern)

    If fileName <> "" Then
        MsgBox "対象ファイル:" & fileName
    Else
        MsgBox "条件に一致するファイルはありません。"
    End If

End Sub

・ファイル名の一部を指定する

「売上」を含むxlsxファイルを対象にする場合は、次のように指定します。

searchPattern = TARGET_FOLDER_PATH & "*売上*.xlsx"

これにより、次のようなファイルが対象になります。

  • 月間売上.xlsx
  • 売上一覧.xlsx
  • 2026年売上集計.xlsx

ただし、「旧売上.xlsx」なども一致するため、不要なファイルを除外したい場合は、命名規則を見直すか、取得後に追加判定する必要があります。

・最初の1件だけで終わらせない設計に注意する

Dir関数は、最初の呼び出しで一致する1件目を返します。

複数ファイルを順番に処理する場合は、引数なしのDirを繰り返して次のファイルを取得します。

Do While fileName <> ""

    ' ファイルごとの処理を記述する

    fileName = Dir

Loop

複数ファイルを扱う場合は、処理中に別のDir関数を呼び出すと検索状態が失われる点にも注意が必要です。

Dir関数で条件に一致するファイル名を取得した後は、取得したパスをWorkbooks.Openメソッドへ渡すことで、対象ブックを自動的に開けます。ファイル名の一部しか分からない場合や、ワイルドカードに一致したブックを開く実装については、VBAでワイルドカードを使ってファイルを開く方法で詳しく解説しています。


 

✅ Like演算子とFindメソッドでは記号の意味が異なる

ワイルドカードは、VBAのすべての機能で同じように使えるわけではありません。Like演算子では「#」や「[]」を利用できますが、Findメソッドでは基本的に「*」と「?」を中心に使用します。同じ記号でも機能によって対応状況が異なるため、別の処理へ流用するときは注意が必要です。

・Like演算子は文字列全体のパターンを判定する

Like演算子は、文字列が指定したパターンに一致するかをTrueまたはFalseで返します。

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

商品コードや管理番号など、文字列全体の形式を確認する処理に向いています。

・Findメソッドは条件に一致するセルを探す

Findメソッドは、ワークシート上から条件に一致するセルを検索します。

Set foundCell = targetRange.Find( _
    What:="*Excel*", _
    LookAt:=xlWhole)

Like演算子が「判定」を目的とするのに対し、Findメソッドは「対象セルの位置を取得する」ことが目的です。

どちらも部分一致に使えますが、必要な結果に応じて使い分ける必要があります。

Findメソッドでは、Like演算子と同じ記号がすべて使えるわけではありません。検索機能ごとにワイルドカードの対応範囲が異なるため、既存コードを流用するときは注意しましょう。⇒【VBA】文字列を検索する方法|Findメソッドで部分一致・複数一致まで徹底解説


✅ ワイルドカードを実務で使う際の注意点

ワイルドカードは条件を柔軟にできますが、その分だけ一致範囲が広くなりやすい機能です。テストデータでは問題なくても、本番データには似た名前のファイルや想定外の表記が含まれていることがあります。自動処理では、意図しない対象まで処理しないよう、検索条件をできるだけ具体的にすることが重要です。

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

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

Option Compare Text

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

一方、Option Compare Binaryでは、大文字と小文字が区別されます。

英字を含むコードやファイル名を判定する場合は、どちらの設定になっているか確認しましょう。

Like演算子による英字の判定結果は、モジュール先頭のOption Compare設定によって変わることがあります。大文字と小文字を区別する条件や、BinaryとTextの具体的な違いは、Option Compareステートメントの使い方で詳しく解説しています。

・特殊記号そのものを検索するときは注意する

「*」「?」「#」「[」などは、ワイルドカードとして特別な意味を持ちます。

そのため、これらの記号そのものを含む文字列を検索したい場合は、意図しない判定になることがあります。

単純に文字列が含まれているか確認したいだけであれば、Like演算子ではなくInStr関数を使う方が分かりやすい場合もあります。

「*」や「?」などをワイルドカードではなく通常の文字として探したい場合は、InStr関数の方が扱いやすいことがあります。特定の文字が最初に現れる位置を取得する方法は、InStr関数で文字位置を検索する方法も参考にしてください。

・検索条件を広くしすぎない

例えば、次の条件は「売上」を含むすべての文字列に一致します。

"*売上*"

便利な一方で、「旧売上」「売上確認用」「売上バックアップ」なども一致します。

対象を限定したい場合は、次のように命名規則を含めます。

"売上_####年.xlsx"

ワイルドカードを多く使うほど便利になりますが、同時に誤判定の可能性も高まります。実際のデータ例を複数用意し、対象になるものと対象外になるものの両方を確認することが大切です。

1つのワイルドカード条件だけでなく、「ExcelまたはVBAを含む」「複数の命名規則のいずれかに一致する」といった判定が必要な場合は、条件の管理方法も重要になります。条件が増えても読みやすさを保つ方法は、Like演算子で複数条件を扱う実務設計で詳しく解説しています。


✅ まとめ:VBAのワイルドカードを目的に合わせて使い分けよう

VBAのワイルドカードを使うと、文字列やセル、ファイル名に対して柔軟な検索・判定条件を指定できます。

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

  • 「*」は0文字以上の任意の文字列を表す
  • 「?」は任意の1文字を表す
  • 「#」は数字1文字を表す
  • 「[]」では文字の候補や範囲を指定できる
  • Like演算子では文字列全体のパターンを判定できる
  • Dir関数では条件に一致するファイル名を取得できる
  • FindメソッドとLike演算子では利用できる記号や目的が異なる
  • 条件が広すぎると想定外のデータまで一致する
  • Option Compareや特殊記号の扱いにも注意が必要

ワイルドカードは、短い条件で多くの文字列を対象にできる便利な機能です。ただし、便利さだけを優先すると、意図しないセルやファイルまで処理してしまう可能性があります。

実務では、検索対象、命名規則、文字数、拡張子などを整理し、必要以上に条件を広げない設計が重要です。まずは「特定の文字を含む」「決まった文字数である」といった基本的な判定から活用し、処理の目的に応じてLike演算子やFindメソッド、Dir関数を使い分けてみてください。

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