「この文字列、”売上”って文字が含まれてるかチェックしたいんだけど……」そんな場面、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 Binary | Option Compare TextかUCase/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 TextかUCase/LCaseを使う - 単純な含有チェックはLike演算子、位置情報が必要ならInStr関数を使う
- If文やFor文、Select Case文と組み合わせると実務で活躍する
- 行削除は下から上にループするのがポイント
Like演算子は使いこなせると、データの振り分けやファイル名チェックなど、日常業務の自動化がぐっと楽になります。まずはこの記事のコード例をコピーして、実際に動かしてみてください。VBA全体の学習ロードマップを知りたい方は、VBAの学習順番ガイドも参考にしてみてくださいね。
