VBA Like演算子の使い方 ― ワイルドカード5種で文字列を曖昧比較する方法

スポンサーリンク

「この文字列、”売上”って文字が含まれてるかチェックしたいんだけど……」そんな場面、VBAで処理を自動化していると結構ありますよね。

普通の=で比較すると、完全に一致しないとTrueになりません。ちょっとでも違うと弾かれてしまうので、曖昧な比較には使えないんです。

そこで活躍するのがLike演算子です。ワイルドカードを組み合わせれば、「〇〇を含む」「〇〇で始まる」といった柔軟な比較が一発でできます。この記事では、5種類のワイルドカードの使い方から、Not Likeの書き方、InStr関数との使い分けまで解説していきます。

VBA Like演算子とは?

Like演算子は、VBAで文字列のパターンマッチング(曖昧比較)を行うための演算子です。

Like演算子が解決する「完全一致しか判定できない」問題

通常の=演算子は「完全一致」しか判定できません。たとえば「売上報告書」と「売上」を=で比較すると、当然Falseになります。

Debug.Print ("売上報告書" = "売上")  ' → False(完全一致ではない)

でも実務では「”売上”という文字を含んでいるか」を調べたい場面のほうがずっと多いですよね。Like演算子なら、こんなふうに書けます。

Debug.Print "売上報告書" Like "*売上*"  ' → True("売上"を含む)

*がワイルドカードです。「任意の文字列」を意味するので、前後に何がついていてもマッチします。

NOTE

Like演算子はVBA固有の機能です。Excelのワークシート関数では直接使えません。ワークシート上で同様の処理をしたい場合は、ワイルドカードに対応したCOUNTIF関数SUBSTITUTE関数を使いましょう。

Like演算子の基本構文

Like演算子の書き方はとてもシンプルです。

result = string Like pattern
要素説明
string比較したい文字列
pattern比較に使うパターン文字列(ワイルドカードを含む)
result一致すればTrue、一致しなければFalse

実際にコードで確認してみましょう。

Sub LikeBasicExample()
    Dim result As Boolean '--- 比較結果 ---

    result = "売上報告書" Like "売上*"
    Debug.Print result  ' → True

    result = "経費精算書" Like "売上*"
    Debug.Print result  ' → False
End Sub

"売上"というパターンは「”売上”で始まる文字列」を意味します。がワイルドカードですね。このあと詳しく説明していきます。

TIP

Debug.Printの結果はイミディエイトウィンドウに表示されます。VBEのメニューから「表示」→「イミディエイトウィンドウ」で表示できます。

VBEの起動方法や画面構成がわからない方は、VBE画面の見方の記事を先にチェックしてみてください。Alt + F11で起動し、「挿入」→「標準モジュール」でコードを書く場所を作ります。

Like演算子で使えるワイルドカード5種一覧

Like演算子の真価を発揮するのが、ワイルドカードです。使えるワイルドカードは全部で5種類あります。

ワイルドカード説明使用例マッチする文字列
*0文字以上の任意の文字列"売上*"売上、売上報告書、売上一覧
?任意の1文字"報告?"報告書、報告A
#任意の数字1文字(0-9)"商品###"商品001、商品123
[charlist]リスト内の任意の1文字"[ABC]組"A組、B組、C組
[!charlist]リスト外の任意の1文字"[!ABC]組"D組、E組(A,B,C以外)

全角文字も1文字としてカウントされる点がポイントです。

*(アスタリスク)の使い方

もっとも使用頻度が高いワイルドカードです。0文字以上の任意の文字列にマッチします。

Sub WildcardAsterisk()
    '--- 前方一致: "売上"で始まる文字列 ---
    Debug.Print "売上報告書" Like "売上*"    ' → True

    '--- 後方一致: "書"で終わる文字列 ---
    Debug.Print "売上報告書" Like "*書"      ' → True

    '--- 部分一致: "報告"を含む文字列 ---
    Debug.Print "売上報告書" Like "*報告*"   ' → True
End Sub

前方一致・後方一致・部分一致のどれも*で対応できます。とても便利ですよね。

?(クエスチョンマーク)の使い方

任意の「1文字」にマッチします。文字数が決まっているときに使うと効果的です。

Sub WildcardQuestion()
    Debug.Print "A-001" Like "?-001"   ' → True
    Debug.Print "AB-001" Like "?-001"  ' → False(2文字なのでマッチしない)
End Sub

?は必ず1文字に対応するので、2文字以上ではマッチしません。文字数を厳密に指定したいときに使いましょう。

#(シャープ)の使い方

任意の「数字1文字」にマッチします。数字だけに絞り込みたいときに便利です。

Sub WildcardSharp()
    Debug.Print "商品123" Like "商品###"  ' → True
    Debug.Print "商品12A" Like "商品###"  ' → False(Aは数字ではない)
End Sub

商品コードや請求書番号など、数字部分のフォーマットチェックに重宝します。

[charlist](文字リスト)の使い方

指定した文字のいずれか1文字にマッチします。範囲指定もできるのが便利なところです。

Sub WildcardCharlist()
    '--- A, B, Cのいずれか ---
    Debug.Print "A組" Like "[ABC]組"    ' → True
    Debug.Print "D組" Like "[ABC]組"    ' → False

    '--- A-Zの範囲指定 ---
    Debug.Print "B組" Like "[A-Z]組"    ' → True

    '--- 0-9の範囲指定 ---
    Debug.Print "3組" Like "[0-9]組"    ' → True
End Sub

[A-Z]でAからZまで、[0-9]で0から9までを一括指定できます。一つずつ書かなくていいので楽ですよね。

[!charlist](否定文字リスト)の使い方

[!charlist]とすれば、指定した文字「以外」にマッチします。

Sub WildcardNotCharlist()
    '--- A, B, C以外の1文字 ---
    Debug.Print "D組" Like "[!ABC]組"    ' → True
    Debug.Print "A組" Like "[!ABC]組"    ' → False

    '--- 数字以外の1文字 ---
    Debug.Print "X組" Like "[!0-9]組"    ' → True
End Sub

「特定の文字を除外したい」ときに便利です。たとえば「先頭が数字以外の行だけ処理する」といった条件に使えます。

Like演算子の実践コード

ここからは業務で役立つ実践的なコード例を紹介します。

特定の文字列を含むセルを探す

セル範囲の中から、特定の文字を含むセルを見つけて処理する例です。For文で繰り返し処理を使って、1行ずつチェックしていきます。

Sub FindMatchingCells()
    Dim i As Long       '--- 行カウンター ---
    Dim lastRow As Long '--- 最終行番号 ---

    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        If Cells(i, 1).Value Like "*売上*" Then
            Cells(i, 2).Value = "該当"
        Else
            Cells(i, 2).Value = ""
        End If
    Next i
End Sub

A列のデータを1行ずつチェックして、「売上」を含むセルのB列に「該当」と書き込みます。Rangeオブジェクトの基本を押さえたうえで、RangeとCellsの使い分けを理解しておくと、もっと柔軟な処理ができますよ。

ファイル名のパターンチェック

ファイル名が規定のフォーマットに沿っているかチェックする例です。#を使って数字部分を検証しています。

Sub CheckFileName()
    Dim sFileName As String '--- 検証対象のファイル名 ---
    sFileName = "報告書_2026-03.xlsx"

    If sFileName Like "報告書_####-##.*" Then
        MsgBox "フォーマットOKです"
    Else
        MsgBox "ファイル名のフォーマットが正しくありません"
    End If
End Sub

「報告書_YYYY-MM.拡張子」という命名規則を、#(数字1文字)と*(任意の文字列)で検証しています。ファイルの受け渡しが多い業務で役立ちますよ。

Select Caseと組み合わせてデータを振り分ける

パターンが多い場合は、Select Case文を使うとコードが見やすくなります。

Sub ClassifyByPattern()
    Dim i As Long       '--- 行カウンター ---
    Dim lastRow As Long '--- 最終行番号 ---
    Dim sValue As String '--- セルの値 ---

    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        sValue = Cells(i, 1).Value

        Select Case True
            Case sValue Like "東京*", sValue Like "神奈川*", sValue Like "千葉*"
                Cells(i, 2).Value = "関東"
            Case sValue Like "大阪*", sValue Like "京都*", sValue Like "兵庫*"
                Cells(i, 2).Value = "関西"
            Case sValue Like "愛知*", sValue Like "静岡*"
                Cells(i, 2).Value = "中部"
            Case Else
                Cells(i, 2).Value = "その他"
        End Select
    Next i
End Sub

Select Case Trueという書き方がポイントです。各CaseにLike式を並べることで、複数パターンをすっきり整理できます。If文ElseIfを何個も書くより、ずっと読みやすくなりますよね。

Not Likeで「含まない」条件を書く方法

Like演算子は「含む」判定だけでなく、「含まない」判定もできます。Notを組み合わせるだけです。

Not Like演算子の書き方

If Not sValue Like "*パターン*" Then
    '--- パターンに一致しない場合の処理 ---
End If

NotをLikeの前に置くだけで、マッチしなかったときにTrueになります。

Sub NotLikeExample()
    Debug.Print Not "売上報告書" Like "*経費*"  ' → True("経費"を含まない)
    Debug.Print Not "経費精算書" Like "*経費*"  ' → False("経費"を含む)
End Sub

特定の文字を含まない行だけ処理する

データクレンジングで「テスト」「仮」などの不要データを除外するときに便利です。

Sub FilterByNotLike()
    Dim i As Long       '--- 行カウンター ---
    Dim lastRow As Long '--- 最終行番号 ---

    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    '--- 下から上にループ(行削除時のズレ防止) ---
    For i = lastRow To 2 Step -1
        If Cells(i, 1).Value Like "テスト*" _
        Or Cells(i, 1).Value Like "*仮*" Then
            Rows(i).Delete
        End If
    Next i
End Sub

TIP

行を削除するときは、下から上に向かってループするのがポイントです。上から削除すると行がずれて、チェック漏れが発生します。最終行の取得方法も合わせて確認しておくと安心です。

大文字・小文字を区別しないVBA Like演算子の比較方法

Like演算子はデフォルトで大文字・小文字を区別します。「ABC」と「abc」は別物として扱われるということです。

区別をなくしたい場合は、2つの方法があります。

Option Compare Textで区別しない設定にする

モジュールの先頭にOption Compare Textと記述します。そのモジュール内のすべての文字列比較で、大文字・小文字が区別されなくなります。

Option Compare Text

Sub CompareIgnoreCase()
    Debug.Print "ABC" Like "abc"  ' → True(区別しない)
    Debug.Print "Hello" Like "hello*"  ' → True
End Sub

NOTE

Option Compare TextはLike演算子だけでなく、=による比較などモジュール内のすべての文字列比較に影響します。Option Explicitと同様に、モジュール先頭に書く宣言文です。

UCase・LCase関数で変換してから比較する方法

比較する前に、両方の文字列を大文字(または小文字)に統一する方法です。特定の箇所だけ大文字小文字を無視したいときに使います。

Sub CompareWithUCase()
    Dim sTarget As String '--- 比較対象の文字列 ---
    sTarget = "Hello World"

    '--- 両方を大文字に変換して比較 ---
    If UCase(sTarget) Like UCase("hello*") Then
        Debug.Print "一致しました"
    End If
End Sub
  • 大文字に変換: UCase(文字列)
  • 小文字に変換: LCase(文字列)

大事なのは、比較する両方の文字列を変換することです。片方だけ変換して「一致しない!」と焦ることがないように気をつけてくださいね。

方法メリットデメリット
Option Compare Text記述が1行で済むモジュール全体に影響する
UCase/LCase影響範囲を限定できる毎回変換の記述が必要

特別な理由がなければOption Compare Textがシンプルでおすすめです。一部の比較だけ無視したい場合はUCase/LCaseを使いましょう。

Like演算子とInStr関数の使い分け

「文字列に特定の文字が含まれるか」を調べる方法は、Like演算子のほかにInStr関数もあります。どう使い分けるか迷う方も多いので、整理しておきましょう。

InStrは「文字位置を返す」、Likeは「True/Falseを返す」

Sub ComparelikeAndInStr()
    Dim sTarget As String '--- 比較対象 ---
    sTarget = "売上報告書"

    '--- Like演算子: True/Falseを返す ---
    Debug.Print sTarget Like "*報告*"    ' → True

    '--- InStr関数: 見つかった位置(数値)を返す ---
    Debug.Print InStr(sTarget, "報告")   ' → 3(3文字目に見つかった)
End Sub

InStr関数は「何文字目にあるか」という位置情報を返します。見つからなければ0を返すので、If InStr(...) > 0 Then と書いて含有チェックもできます。

If文と組み合わせるならLikeが読みやすい

単純に「含むかどうか」だけを知りたいなら、Like演算子のほうがコードの意図が伝わりやすいです。

'--- Like演算子: 直感的に読める ---
If sValue Like "*売上*" Then

'--- InStr関数: 「> 0」の意味を知っている必要がある ---
If InStr(sValue, "売上") > 0 Then
比較項目Like演算子InStr関数
戻り値True/False位置(数値)
部分一致"文字"InStr(文字列, 検索文字)
前方一致"文字*"Left(文字列, n) = "文字"
ワイルドカード5種使える使えない
位置の取得できないできる
読みやすさ直感的やや技術的

使い分けのまとめ: 「含む/始まる/パターン一致」の判定 → Like演算子。「何文字目にあるか」の位置情報が必要 → InStr関数

よくあるエラーと対処法

Like演算子を使うときによく遭遇するトラブルと、その対処法をまとめました。

トラブル原因対処法
ワイルドカード文字自体を検索したい*?がワイルドカードとして解釈される[*][?]のように[]で囲む
Null値で結果がNullになるLike演算子にNull値が入るIsNullで事前チェックする
大文字・小文字が区別されるデフォルトのOption Compare BinaryOption Compare TextUCase/LCaseで統一
全角・半角が区別される全角と半角は別の文字として扱われるStrConvで事前に統一する
マクロが実行できない.xlsx形式で保存している.xlsm(マクロ有効ブック)で保存し直す
セキュリティ警告が出るマクロが無効に設定されている「コンテンツの有効化」をクリックする

ワイルドカード文字そのものを検索したい

*?自体を検索したい場合は、[]で囲みます。

Sub SearchLiteralWildcard()
    '--- 「*」そのものを含む文字列を検索 ---
    Debug.Print "価格*未定" Like "*[*]*"  ' → True
    Debug.Print "価格は未定" Like "*[*]*" ' → False
End Sub

Null値でエラーになる

Like演算子の対象にNull値が入ると、結果もNullになります。事前にチェックしておくのが安全です。

Sub SafeLikeCheck()
    Dim vValue As Variant '--- セルの値(Null対応のためVariant型) ---
    vValue = Cells(1, 1).Value

    If Not IsNull(vValue) Then
        If CStr(vValue) Like "*売上*" Then
            Debug.Print "一致しました"
        End If
    End If
End Sub

ここではVariant型を使っています。VBAの型宣言に不安がある方は、変数の使い方の記事で基本を押さえておきましょう。変数の中身を確認したいときは、ウォッチウィンドウで監視すると便利です。

全角・半角を統一して比較する

全角と半角が混在するデータを比較するときは、StrConv関数で事前に統一しましょう。Trim関数で前後の空白を除去してから比較すると、さらに精度が上がります。

Sub CompareWithStrConv()
    Dim sTarget As String '--- 比較対象の文字列 ---
    sTarget = "ABC123"

    '--- 半角に変換してから比較 ---
    If StrConv(sTarget, vbNarrow) Like "ABC*" Then
        Debug.Print "一致しました"  ' → True
    End If
End Sub

Like演算子と正規表現の使い分け

「Like演算子で対応できないパターンがある」と感じたら、正規表現(RegExp)を検討してみてください。

比較項目Like演算子正規表現(RegExp)
参照設定不要Microsoft VBScript Regular Expressions が必要
学習コスト低い高い
対応パターン前方/後方/部分一致、文字リスト量指定子、グループ化、後方参照など
向いている場面シンプルなパターンマッチ複雑なパターン、置換処理

簡単なパターンマッチならLike演算子、複雑なパターンなら正規表現、と使い分けるのがおすすめです。

まとめ

Like演算子とワイルドカードの使い方を振り返っておきましょう。

  • Like演算子は文字列の曖昧比較(パターンマッチング)に使う
  • ワイルドカードは5種類: *(0文字以上)、?(1文字)、#(数字1文字)、[charlist](リスト内)、[!charlist](リスト外)
  • Not Likeで「含まない」条件も書ける
  • 大文字・小文字を無視するにはOption Compare TextUCase/LCaseを使う
  • 単純な含有チェックはLike演算子、位置情報が必要ならInStr関数を使う
  • If文For文Select Case文と組み合わせると実務で活躍する
  • 行削除は下から上にループするのがポイント

Like演算子は使いこなせると、データの振り分けやファイル名チェックなど、日常業務の自動化がぐっと楽になります。まずはこの記事のコード例をコピーして、実際に動かしてみてください。VBA全体の学習ロードマップを知りたい方は、VBAの学習順番ガイドも参考にしてみてくださいね。

この記事で紹介したVBA関連記事

タイトルとURLをコピーしました