🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の Like 演算子 — ワイルドカード照合と文字列全体の罠

|

Excel VBA の Like 演算子 — ワイルドカード照合と文字列全体の罠

TL;DRtext Like patternBoolean を返します。文字列全体 がこのワイルドカードの パターンに一致するか? ワイルドカードは *(任意の長さの文字列)、?(ちょうど 1 文字)、 #(ちょうど 1 桁の数字)、[abc](集合から 1 文字)、[!abc](集合に ない 1 文字)の 5 つです。 噛みついてくるのは 2 つ。Like文字列全体 に一致するので、部分文字列を調べるには "abc" では なく "*abc*" が要ること。そして、その大文字小文字の区別は モジュール全体Option Compare で設定され、InStr にあるような呼び出しごとの フラグがないことです。

Sub LikeBasics()
    Debug.Print "Excel"   Like "Ex*"        ' True  - "Ex" で始まる
    Debug.Print "Excel"   Like "*x*"        ' True  - "x" を含む
    Debug.Print "Excel"   Like "?????"      ' True  - ちょうど 5 文字
    Debug.Print "A-1234"  Like "[A-Z]-####" ' True  - 英字、ダッシュ、4 桁
    Debug.Print "cat"     Like "[!0-9]*"    ' True  - 数字では始まらない

    Debug.Print "Excel"   Like "x"          ' False - Like は文字列全体に一致する
    Debug.Print "Excel"   Like "excel"      ' False - 既定では大文字小文字を区別する
End Sub

この記事で学べること

  • 考え方の軸 — Like は検索ではなく、形の検査
  • 5 つのワイルドカードそれぞれと、正確に何に一致するか
  • Like が文字列全体を検査するため、部分文字列の検査には前後の * が要る理由
  • 大文字小文字がモジュール全体の Option Compare スイッチであり、呼び出しごとのフラグではない理由
  • リテラルの *?#[ に角かっこのエスケープで一致させる方法
  • Like・InStr・ワークシートのワイルドカードの使い分け

考え方の軸:Like は検索ではなく、形の検査

Like は、あなたの文字列の 内側 で何かを探しているのではありません。パターンを文字列の端から端まで 重ね、たった 1 つの Yes/No を問います。この文字列全体はこの形をしているか? これは InStr とは別の仕事です — InStr は部分文字列を探して それが どこ にあるかを報告します。また 正規表現 とも別で、正規表現は断片を 見つけ、数え、取り出せます。Like が返すのは TrueFalse だけです。

その捉え方が、いつ Like が合うかを教えてくれます。決まった形 があり、判定が欲しいときです。これは 有効な SKU か("[A-Z][A-Z]-####")? このファイル名は .xlsx で終わるか("*.xlsx")? このコードは 数字だけか(Not (s Like "*[!0-9]*"))? どれも形の問いであり、Like はそれを読みやすい 1 行で 答えます — 作るオブジェクトも、ループも、位置の計算もありません。

ワイルドカードと、それぞれが一致するもの

特別なトークンは 5 つ、パターン内のそれ以外はすべて、そのとおりに現れなければならないリテラルです。

ワイルドカード 一致するもの True を返す例
* 任意の文字の 0 個以上 "report_2026.xlsx" Like "*.xlsx"
? ちょうど 1 文字 "b1g" Like "b?g"
# ちょうど 1 桁の数字(0-9) "A7" Like "A#"
[list] リストまたは範囲の中の 1 文字 "m" Like "[a-m]"
[!list] リストに ない 1 文字 "x" Like "[!aeiou]"

角かっこ内の範囲は小さいほうから大きいほうへ([A-Z][0-9])と書き、集合は組み合わせられます ([A-Za-z0-9])。# ワイルドカードはワークシートのワイルドカードに相当物のない VBA の便利機能であり、 [!...] の否定は、現実の検証の大半を支える道具です — "*[!0-9]*" は「どこかに数字でない文字を 少なくとも 1 つ含む」を意味し、それを否定して「数字だけ」を主張します。

罠 1:Like は部分文字列ではなく文字列全体を検査する

これは「Like が一致しない」という質問の第 1 位で、検索のふるまいを期待するところから来ます。

Debug.Print "Invoice 2026" Like "2026"     ' False - 文字列は "2026" だけではない
Debug.Print "Invoice 2026" Like "*2026*"   ' True  - どこかに "2026" を含む
Debug.Print "Invoice 2026" Like "Invoice*" ' True  - "Invoice" で始まる

パターンは、最初の文字から最後の文字まで文字列を描写しなければなりません。断片が どこかに 現れる ことだけを気にするなら、両側を * でくるみます。「これがあの文字どおりのテキストを含むか」を純粋に 知りたいだけなら、InStr のほうが直接的な道具で — InStr(s, "2026") > 0 — 解釈すべきパターンがないぶん速くもあります。Like に手を伸ばすのは、単なる 部分文字列の有無ではなく が問題になるとき(先頭に固定、ここは数字、あそこは英字)です。

罠 2:大文字小文字は Option Compare 次第で、呼び出しごとの上書きはできない

既定ではモジュールは Option Compare Binary を使うので、Like大文字小文字を区別 します。

Debug.Print "Excel" Like "excel"   ' False - 既定の Option Compare Binary では

モジュールのいちばん上(すべてのプロシージャより上)に Option Compare Text を置くと、そのモジュール内の すべて の文字列比較 — =Like、明示的な引数のない InStr — が大文字小文字を区別しなくなります。

Option Compare Text          ' モジュール全体、モジュールの先頭に

Sub CaseInsensitive()
    Debug.Print "Excel" Like "excel"   ' 今度は True
End Sub

ここが、いとこたちとのはっきりした違いです。Like には 呼び出しごとの大文字小文字フラグがありませんInStrFilter はどちらも vbTextCompare を引数に取るので、その 1 回だけ 大文字小文字を無視し、ほかはすべて区別したままにできます。Like はそれができません — その大文字小文字の ふるまいはモジュール全体の性質だからです。モジュールを切り替えずに 1 か所だけで大文字小文字を無視した 一致が欲しいなら、UCase で自分で大文字小文字を畳みましょう (UCase(s) Like "EXCEL")。そうすれば、効果は 100 行離れた Option 行に隠れるのではなく、局所的で 一目瞭然に保てます。

罠 3:リテラルのアスタリスク・疑問符・角かっこに一致させる

遅かれ早かれ、本物の *? に一致させる必要が出てきます — ワイルドカードを含むファイル名、文字どおり # を含む検索ボックス。特別な文字を角かっこの中に入れてエスケープします。

Debug.Print "3*4"  Like "*[*]*"   ' True  - リテラルのアスタリスクを含む
Debug.Print "OK?"  Like "*[?]"    ' True  - リテラルの疑問符で終わる
Debug.Print "C#"   Like "*[#]"    ' True  - リテラルのハッシュ(「数字」ではない)
Debug.Print "a[1]" Like "*[[]*"   ' True  - リテラルの開き角かっこ

これはワークシートの流儀では ない ことに注意してください。Range.FindApplication.MatchCOUNTIF はワイルドカードを先頭のチルダ(~*~?)でエスケープし、#[!list] はまったく 理解しません。同じ製品の中に 2 つの異なるワイルドカードの方言が同居していて、両者を取り違えること — Like パターンで ~* を使ったり、Find[*] を使ったり — は、決して発火しない一致という、 微妙で静かな原因になります。

Like・InStr・ワークシートのワイルドカードの使い分け

道具を取りちがえないための、一行の判断基準です。

  • InStr — リテラルの部分文字列が あるか、どこに 現れるかを知りたい。「この文字どおりのテキストを含む」に最速。
  • Like についての Yes/No が欲しい。先頭に固定、位置ぎめ、数字か英字か、区切られた集合。 Boolean 1 つ、文字列全体。
  • Range.Find / ワークシートのワイルドカードシート上のセル に対して 照合していて、方言は *?、そしてエスケープの ~。別の道具、別のワイルドカード。
  • RegExp — 形に繰り返し回数、選択(this|that)、あるいは取り出したい グループがある。それは Like が表現できる範囲を超えています。

パターンが Like の手に余ったら — 仕事の方を説明する

Like は、形が固定でなくなる一点までは楽しい道具です。ルールが「3 〜 5 文字の英字、それからダッシュ、 それから 可変個 の数字、そしてその数字を取り出す」になった瞬間、あなたは Like のまわりにループを 書くか、MidInStr を継ぎ足すことになり、意図は配管の中に消えていきます。それが、 本物のパターン に登るか — あるいはコードそのものを飛ばすかの合図です。 ExcelMaster なら、ルールを普通の 言葉で — 「コードが英字 3 文字のあと数字 4 桁の行を残して、その数字を D 列に入れて」 — と言うだけです。 そして、その一致を適用し、まずファイルをバックアップし、結果を書き出す Python を生成します。あなたは 形を説明するだけ。ワイルドカードも、大文字小文字も、端も、それが処理します。

よくある質問

VBA の Like 演算子は何をしますか?

Like は文字列をパターンと比べ、文字列全体 が一致すれば True を返します。パターンには ワイルドカードを含められます。*(任意の長さの文字列)、?(1 文字)、#(1 桁の数字)、 [list](集合から 1 文字)、[!list](集合にない 1 文字)です。Boolean を返すので、IfDo While の条件の中で使われます。

VBA の Like の比較が一致しないのはなぜですか?

よくある原因は 2 つ。第一に、Like は文字列全体に一致するので、"Invoice 2026" Like "2026"False です — 断片をアスタリスクでくるみましょう("*2026*")。第二に、既定の Option Compare Binary では 大文字小文字を区別するので、モジュールの先頭に Option Compare Text を加えるか UCase で大文字小文字を 畳むまで、"Excel" Like "excel"False です。

VBA の Like を大文字小文字を区別しないようにするには?

モジュールの先頭に Option Compare Text を置きます — そのモジュール内のすべての文字列比較が、Like を 含めて大文字小文字を区別しなくなります。Like には InStrFilter のような呼び出しごとの大文字 小文字引数がないので、モジュールを変えずに 1 回だけ大文字小文字を無視した一致が欲しいときは、畳んだ 文字列どうしを比べます(UCase(value) Like "PATTERN")。

VBA の Like でリテラルのアスタリスクや疑問符に一致させるには?

特別な文字を角かっこでくるみます。[*] はリテラルのアスタリスク、[?] はリテラルの疑問符、[#] は リテラルのハッシュ、[[] はリテラルの開き角かっこに一致します。たとえば "3*4" Like "*[*]*"True です。この角かっこによるエスケープは Like に固有で、Range.Find のようなワークシートの道具は代わりに 先頭のチルダ(~*)を使います。

VBA で正規表現の代わりに Like を使うべきなのはどんなときですか?

形が固定で、Yes/No だけが必要なときに Like を使います。ファイル拡張子、固定長のコード、数字だけの チェックなどです。パターンに可変の繰り返し(\d{2,4})、選択(cat|dog)、あるいは取り出したい キャプチャグループがあるときは、RegExp に手を伸ばします。Like は繰り返しを 数えることも、一致した断片を返すこともできませんが、正規表現にはできます。

検証環境

検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-04.

関連ガイド: VBA IsNumeric · VBA Regex · VBA InStr · VBA Find · VBA UCase and LCase