【2026年8月最新】VBAのLike演算子完全ガイド|ワイルドカード・エスケープ・否定パターンの使い方
「セルの値が特定のパターンに一致するかどうかを判定したい」「ファイル名の先頭が"見積書_"で始まるものだけ処理したい」「型番の末尾3桁が数字のデータだけ抽出したい」——こうしたあいまいな条件での文字列判定を、Excel VBAで実現する手段の1つが「Like演算子」です。
Like演算子は、正規表現ほど複雑な記法を覚えなくても、ワイルドカード(*・?・#)を使った直感的な書き方でパターンマッチングができるのが特徴です。一方で、文字リスト[charlist]の範囲指定や否定パターン[!charlist]、記号自体をエスケープする方法など、初見だとつまずきやすいポイントも複数あります。
この記事を最後まで読むと、次の内容が理解できます。
01 WHAT IS LIKE OPERATOR Like演算子とは何か・ワイルドカードで文字列比較する仕組み 「一致するか」ではなく「パターンに合うか」を判定する演算子
Like演算子は、VBAで文字列が特定の「パターン」に一致するかどうかをTrue/Falseで判定する演算子です。「=」演算子が「完全に同じ文字列かどうか」しか判定できないのに対して、Like演算子は「先頭が○○で始まる」「末尾が○○で終わる」「特定の文字種を含む」といった、あいまいな条件でのパターン一致を1行で表現できます。
📚 用語解説
Like演算子:VBAの組み込み演算子の1つ。「文字列 Like パターン文字列」という構文で、左辺の文字列が右辺のパターンに一致するかをTrue/Falseで返す。パターン側にワイルドカード文字(* ? # [charlist])を組み合わせて、あいまいな条件のマッチングを行う。
たとえば「顧客コードが"C"で始まり、その後に4桁の数字が続く」という条件は、正規表現なら^C\d{4}$のように書きますが、Like演算子であれば"C" & String(4, "#")を組み立てるか、直接"C####"というパターン文字列を書くだけで判定できます。記号の意味さえ覚えれば、正規表現よりも直感的に読めるのがLike演算子の強みです。
' Like演算子の基本構文
Sub LikeBasicExample()
Dim result As Boolean
result = "見積書_20260801.xlsx" Like "見積書_*"
MsgBox result ' True("見積書_"で始まる)
result = "C1234" Like "C####"
MsgBox result ' True(Cの後に数字4桁)
result = "Apple" Like "A??le"
MsgBox result ' True(A + 任意2文字 + le)
End Sub
構文の基本は「文字列 Like パターン」で、パターン側にだけワイルドカード文字を書ける点がポイントです。左辺の文字列にワイルドカードを書いても記号としては解釈されず、リテラルな文字として扱われます。
📚 用語解説
パターンマッチング:ある文字列が、あらかじめ定義した「型(パターン)」に当てはまるかどうかを判定する処理全般を指す用語。Like演算子のワイルドカード方式や、正規表現(RegExp)方式など、複数の実現方法がある。
セル・変数の値
ワイルドカードで条件を記述
string Like pattern
If文・フィルタ条件に利用
Option Compare Textを書くと「テキスト比較」になり、大文字小文字を区別しなくなります。この挙動を知らずに「なぜかマッチしない」とハマる人が意外と多いです。📚 用語解説
Option Compare Text / バイナリ比較:VBAモジュールの文字列比較モードを指定する宣言。既定は「バイナリ比較(Option Compare Binary)」で大文字小文字を区別する。モジュール冒頭にOption Compare Textと書くと「テキスト比較」となり、Like演算子や"="での文字列比較が大文字小文字を無視するようになる。
Like演算子の判定結果が「想定と違う」と感じたら、まずモジュール先頭にOption Compare Textの宣言があるかどうかを確認してください。他のモジュールからコピーしたコードに紛れ込んでいるケースが典型的な原因です。
02 WILDCARD SYNTAX 基本構文とワイルドカード文字4種類 * ? # [charlist] それぞれの意味を正確に押さえる
Like演算子で使えるワイルドカード文字は、基本的に4種類です。それぞれ「何文字にマッチするか」「どんな種類の文字にマッチするか」が異なるため、まずは一覧で全体像を押さえます。
| ワイルドカード | 意味 | 一致する文字数 | 例 | マッチする文字列例 |
|---|---|---|---|---|
| *(アスタリスク) | 任意の文字(0文字以上) | 0文字〜任意の長さ | "A*Z" | AZ, ABZ, ABCXYZ |
| ?(クエスチョン) | 任意の1文字 | 必ず1文字 | "A?Z" | ABZ, A1Z(AZやABCZは不一致) |
| #(シャープ) | 任意の1桁の数字(0〜9) | 必ず1文字(数字のみ) | "A#Z" | A1Z, A9Z(ABZは不一致) |
| [charlist] | charlist内のいずれか1文字 | 必ず1文字 | "[ABC]12" | A12, B12, C12 |
特に重要なのは、「*」だけが0文字以上の可変長にマッチするという点です。「?」と「#」は必ず1文字分を消費するため、桁数が固定されているデータの検証(郵便番号・電話番号・型番など)に向いています。逆に「先頭一致・末尾一致・部分一致」のような可変長条件には「*」を使います。
' ワイルドカード4種類の使い分け例
Sub WildcardTypes()
' * : 任意の文字数(0文字以上)に一致
Debug.Print "invoice_2026.pdf" Like "invoice_*" ' True
' ? : ちょうど1文字に一致
Debug.Print "A1Z" Like "A?Z" ' True
Debug.Print "ABCZ" Like "A?Z" ' False(2文字あるので不一致)
' # : ちょうど1桁の数字に一致
Debug.Print "A1Z" Like "A#Z" ' True
Debug.Print "AXZ" Like "A#Z" ' False(数字ではない)
' [charlist] : リスト内のいずれか1文字に一致
Debug.Print "商品A" Like "商品[ABC]" ' True
Debug.Print "商品D" Like "商品[ABC]" ' False
End Sub
2-1. 固定長パターンでの桁数チェック
「#」は数字1桁専用のワイルドカードなので、郵便番号・電話番号・社員番号のような桁数が決まった数値データの形式チェックにそのまま使えます。たとえば日本の郵便番号(ハイフンあり7桁)は"###-####"というパターン1本で判定可能です。
| データ種別 | パターン例 | 判定内容 |
|---|---|---|
| 郵便番号 | "###-####" | 3桁-4桁の数字形式かどうか |
| 社員番号 | "S#####" | Sの後に数字5桁が続くかどうか |
| 西暦4桁 | "####" | 数字4桁ちょうどかどうか |
| 携帯電話番号 | "0[789]0-####-####" | 070/080/090で始まる11桁形式かどうか |
03 CHARACTER LIST 文字リスト[charlist]と範囲指定 [A-Z]のような範囲指定と、複数条件の組み合わせ方
[charlist]は、角括弧の中に列挙した文字のいずれか1文字にマッチするワイルドカードです。単に文字を並べる書き方([ABC])のほかに、ハイフンでつないだ範囲指定([A-Z])も使えます。範囲指定と個別指定は同じ角括弧の中で組み合わせることも可能です。
📚 用語解説
文字リスト(charlist):Like演算子のワイルドカード[ ]の中に書く、マッチ対象とする文字の集合。個別の文字を並べる書き方([ABC])と、文字コード順の範囲を示すハイフン区切りの書き方([A-Z])の両方に対応する。範囲は昇順(若いコード→大きいコード)で書く必要があり、[Z-A]のような降順指定はエラーになる。
' 文字リスト・範囲指定の例
Sub CharListExamples()
' 個別の文字リスト
Debug.Print "商品A" Like "商品[ABC]" ' True
' 範囲指定(アルファベット大文字)
Debug.Print "Zebra" Like "[A-Z]*" ' True(先頭が大文字アルファベット)
' 範囲指定(数字)
Debug.Print "5個入り" Like "[0-9]個入り" ' True
' 範囲と個別文字の組み合わせ
Debug.Print "X99" Like "[A-Za-z0-9][0-9][0-9]" ' True(英数字1文字+数字2桁)
' 降順の範囲指定はエラーになる(実行時エラー)
' Debug.Print "A" Like "[Z-A]" ' エラー:不正な範囲
End Sub
実務でよく使うのは、「先頭が半角英大文字で始まるコードだけを抽出したい」というようなケースです。[A-Z]*と書くだけで、全角文字や数字始まりのコードを除外できます。範囲指定は文字コードの並び順に依存するため、全角文字を範囲指定に混ぜると意図しない挙動になりやすい点は注意が必要です。
[ぁ-ん]のような全角文字の範囲指定は、環境(文字コード)によって挙動が変わる可能性があります。日本語の文字種を判定したい場合は、範囲指定に頼らず、AscW関数で文字コードを取得して数値で比較する方が安全です。
3-1. 複数の範囲を1つの[ ]内に混在させる
[A-Za-z0-9]のように、英大文字・英小文字・数字の3つの範囲を1つの角括弧内にまとめて書くこともできます。これは「英数字1文字」を表す定番パターンとして、型番や商品コードの検証で頻出します。
04 NEGATION PATTERN 否定パターン[!charlist]の使い方 「含まない」「一致しない」条件をLike演算子で書く
文字リストの先頭に「!」を付けると、「charlist内のいずれにも一致しない1文字」という否定条件になります。「数字を含まない」「特定の記号だけを弾きたい」といった、除外条件のバリデーションで威力を発揮します。
📚 用語解説
否定パターン [!charlist]:Like演算子の文字リストにおいて、角括弧の先頭に感嘆符(!)を付けた記法。charlist内に列挙した文字のいずれにも一致しない1文字にマッチする。例えば[!0-9]は「数字以外の1文字」を意味する。
' 否定パターンの例
Sub NegationExample()
' 数字を含まない文字列かどうか(1文字ずつ判定が必要な場合)
Debug.Print "abc" Like "[!0-9][!0-9][!0-9]" ' True(3文字とも数字ではない)
Debug.Print "a1c" Like "[!0-9][!0-9][!0-9]" ' False(2文字目が数字)
' 先頭が数字で始まっていない文字列か
Debug.Print "商品コード" Like "[!0-9]*" ' True(先頭は数字ではない)
Debug.Print "123コード" Like "[!0-9]*" ' False(先頭が数字)
End Sub
注意したいのは、[!charlist]はあくまで「1文字」に対する否定であり、「文字列全体にcharlistの文字が1つも含まれない」ことを保証するものではない点です。文字列全体に対して「特定の文字を一切含まない」ことを判定したい場合は、[!charlist]を文字数分並べるか、後述するInStr関数との組み合わせが現実的です。
"abc123" Like "[!0-9]*" は先頭1文字が数字でないかを判定しているだけで、文字列全体に数字が含まれないかは判定していません。実際にこの例は先頭が"a"なのでTrueになりますが、文字列全体には数字が含まれています。「全体に含まれない」条件にはInStrとの組み合わせが必要です。
' 「文字列全体に特定の文字を含まない」を正しく判定する
Function ContainsNoDigit(s As String) As Boolean
Dim i As Long
For i = 1 To Len(s)
If Not (Mid(s, i, 1) Like "#") Then
' 数字以外の文字が来ても継続チェック
Else
ContainsNoDigit = False
Exit Function
End If
Next i
ContainsNoDigit = True
End Function
' もしくはInStr系で判定する方がシンプル
Function ContainsNoDigit2(s As String) As Boolean
Dim i As Long
For i = 0 To 9
If InStr(s, CStr(i)) > 0 Then
ContainsNoDigit2 = False
Exit Function
End If
Next i
ContainsNoDigit2 = True
End Function
05 ESCAPING エスケープ処理:ワイルドカード文字自体を検索する *・?・#・[・]をリテラル文字として扱う方法
ワイルドカード文字(* ? # [ ])そのものを「特殊記号ではなく、ただの1文字」として検索したい場面もあります。たとえば「文字列内に実際のアスタリスク記号"*"が含まれているか」を判定したいケースです。この場合は、該当の記号を角括弧[ ]で囲むことでエスケープできます。
📚 用語解説
エスケープ処理:プログラミングにおいて、特別な意味を持つ記号を「意味を持たないただの文字」として扱わせるための処理。Like演算子では、ワイルドカード記号(* ? #)を角括弧[ ]で囲むことでエスケープし、リテラルな1文字として検索できる。
' ワイルドカード文字自体をエスケープして検索する
Sub EscapeExample()
' "*"をリテラル文字として検索したい場合は [*] と書く
Debug.Print "3*4=12" Like "3[*]4*" ' True(実際の"*"に一致)
' "?"をリテラル文字として検索
Debug.Print "OK?" Like "OK[?]" ' True
' "#"をリテラル文字として検索
Debug.Print "No.#5" Like "No.[#]5" ' True
' "]"(閉じ角括弧)は charlist 内でリテラルとして表現する記法が無いため、
' 角括弧の外にそのまま書けばリテラルな1文字として扱われる("]"自体はワイルドカードではない)
Debug.Print "A]B" Like "A]B" ' True
' "-"(ハイフン)は charlist の先頭か末尾に置くとリテラル扱いになる
Debug.Print "A-B" Like "A[-]B" ' True
End Sub
つまり、「[ ]で囲んだ記号は特殊な意味を失い、そのままの文字として扱われる」というのがエスケープの基本原理です。正規表現でのバックスラッシュ(\)によるエスケープと考え方は似ていますが、書き方が異なるため混同しないよう注意してください。
| エスケープしたい文字 | Like演算子での書き方 | 正規表現での書き方(参考) |
|---|---|---|
| *(アスタリスク) | [*] | \* |
| ?(クエスチョン) | [?] | \? |
| #(シャープ) | [#] | 該当なし(\dで代替) |
| ](閉じ角括弧) | 角括弧の外にそのまま書く(charlist内では表現不可) | \] |
| -(ハイフン) | [-](charlistの先頭か末尾に置く) | \- |
複数の記号を1つの角括弧内にまとめてエスケープすることも可能です。たとえば"[*?#]"と書けば、*・?・#のいずれか1文字にリテラルとして一致します。ファイル名に使えない禁止文字(\ / : * ? " < > |)を検出する処理で活用できます。
06 COMPARISON Like vs InStr vs Replace vs RegExp 使い分け比較 「あいまいな判定はLike」を軸に、他の文字列関数との住み分けを整理
VBAには文字列を扱う方法が複数あります。それぞれ得意な処理が異なるため、「今やりたいこと」に応じて最適な手段を選ぶことが、読みやすく壊れにくいコードにつながります。
| 手段 | 主な用途 | 得意なこと | 苦手なこと |
|---|---|---|---|
| Like演算子 | パターン一致の判定(True/False) | シンプルなワイルドカード条件を直感的に書ける | 複雑な条件(繰り返し回数指定・グループ化) |
| InStr関数 | 部分一致の検索(位置の取得) | 「含まれているか」の高速判定、位置情報の取得 | パターンでの判定(先頭N文字が数字、等) |
| Replace関数 | 固定文字列の置換 | 決まった文字列を別の文字列に一括置換 | パターンに一致する箇所だけを狙った置換 |
| RegExp(正規表現) | 複雑なパターンの検証・抽出・置換 | 繰り返し・グループ化・後方参照などの高度な条件 | 参照設定やCreateObjectの準備、記法の習得コスト |
📚 用語解説
InStr関数:VBAの標準関数の1つ。InStr(検索対象の文字列, 検索する文字列)の形式で呼び出し、検索する文字列が最初に見つかった位置(見つからなければ0)を返す。「含まれているかどうか」だけを知りたい場合はLike演算子より高速に動作する。
📚 用語解説
RegExp(正規表現):文字列のパターンを記号(メタ文字)で表現する仕組み。VBAではCreateObject("VBScript.RegExp")で利用する。繰り返し回数の指定({n,m})やグループ化(())、選択(|)などLike演算子にはない高度な表現が可能な一方、記法の習得コストが高い。
判断の目安としては、「ワイルドカード1〜2個で書けるシンプルな条件ならLike演算子」「単純に含まれるかどうかだけならInStr」「複雑な条件分岐や繰り返しパターンが必要ならRegExp」という順で検討するとコードがシンプルに保てます。
' 同じ「先頭一致」を3つの方法で書き比べる
Sub CompareMethods()
Dim s As String
s = "invoice_20260801.pdf"
' 方法1: Like演算子(最もシンプル)
Debug.Print s Like "invoice_*"
' 方法2: InStr(先頭一致だけならLeftとの組み合わせが必要)
Debug.Print Left(s, 8) = "invoice_"
' 方法3: RegExp(オーバースペック気味だが複雑な条件には強い)
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "^invoice_"
Debug.Print re.Test(s)
End Sub
07 PRACTICAL PATTERNS 業務での実践活用パターン集 ファイル名フィルタ・データ検証・在庫コード判定への応用例
ここでは、Like演算子を業務マクロに組み込む際の具体的なユースケースを、コード例つきで紹介します。いずれも「ワイルドカードで条件を書けば1行で済む」典型パターンです。
7-1. フォルダ内のファイルを名前パターンで絞り込む
' フォルダ内の特定パターンのファイルだけをリストアップする
Sub ListMatchingFiles()
Dim folderPath As String, fileName As String
folderPath = "C:\Reports\"
fileName = Dir(folderPath)
Do While fileName <> ""
' "見積書_"で始まり、拡張子が.xlsxのファイルだけ処理
If fileName Like "見積書_*.xlsx" Then
Debug.Print fileName & " を処理対象に追加"
End If
fileName = Dir()
Loop
End Sub
7-2. 入力データの形式チェック(バリデーション)
' セルの入力値が想定フォーマットかどうかをチェックする
Function IsValidProductCode(code As String) As Boolean
' 例: 商品コードは "英大文字1文字+数字4桁" の形式
IsValidProductCode = code Like "[A-Z]####"
End Function
Sub ValidateSheetData()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim i As Long
For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
If Not IsValidProductCode(ws.Cells(i, 1).Value) Then
ws.Cells(i, 1).Interior.Color = RGB(255, 200, 200) ' 不正データを赤色に
End If
Next i
End Sub
7-3. 複数条件をOrでつないだ仕分け処理
' 複数の部署コードパターンで案件を仕分ける
Sub ClassifyByDeptCode(deptCode As String)
Select Case True
Case deptCode Like "SL-*"
Debug.Print "営業部の案件"
Case deptCode Like "AC-*"
Debug.Print "経理部の案件"
Case deptCode Like "DV-*"
Debug.Print "開発部の案件"
Case Else
Debug.Print "未分類"
End Select
End Sub
Like演算子で"*@*.*"のようなパターンを書けば大まかなメールアドレス形式は判定できますが、厳密なRFC準拠のメールアドレス検証には向きません。業務上「明らかにおかしい入力を弾く」程度の用途にとどめ、正式な検証が必要な場合はRegExpや外部の検証サービスとの併用を検討してください。
08 GENAI CASE DATA 【独自データ】GENAI社内のVBA文字列処理業務の実態 Excel/VBAの手作業がどれだけの時間を食っているか
ここでは、弊社(株式会社GENAI)が実際にどの程度の業務時間をExcel/VBA周りの文字列処理・データ整形に費やしていたか、社内の実運用データをもとに紹介します。「Like演算子のようなワイルドカード判定を人力で書き続けること」自体が、実は見えにくいコストになっているケースが多くあります。
| 項目 | 内容 |
|---|---|
| 利用プラン | Claude Max 20x(月額$200/約30,000円) |
| 利用開始 | 2025年後半〜 |
| 適用範囲 | 経営・営業・広告・開発・経理・秘書業務・個人業務まで全社 |
| 文字列処理関連の主な用途 | Excel/VBAでのデータクレンジング、ファイル名判定、フォーマットチェックの自動化 |
弊社の経理・開発業務の中では、請求書チェックや経費仕訳のような「決まったパターンに沿っているかを確認する」作業が定常的に発生します。以前はこうした確認作業を、担当者が目視でチェックするか、都度Like演算子や関数を組んだVBAマクロを手で書いて対応していました。
| 業務領域 | 主な用途 | 概算削減時間(肌感ベース) |
|---|---|---|
| 経理 | 請求書チェック・経費仕訳・Freee連携 | 月40h → 月5h |
| 開発 | WordPress/HTML/LP制作、スクリプト書き捨て | 都度数時間削減 |
| 秘書業務 | 日報生成・議事録・スケジュール調整 | 日2h → 日15分 |
上記は弊社の肌感ベースの数値であり、業種・業態・担当者のスキルによって削減時間は変動します。「完全自動化」ではなく、人間のレビュー・微調整を伴う運用である点にもご留意ください。
特に経理領域では、請求書番号や取引先コードが「決まったフォーマットに沿っているか」をチェックする作業に、Like演算子的なパターン判定の考え方がそのまま活きています。ただし、実際の業務ではこうした「パターンを設計する」こと自体を都度エンジニアやマクロに詳しい担当者に頼む必要があった点が、これまでのボトルネックでした。
09 COMMON PITFALLS 【独自】非エンジニアがLike演算子でハマる3つの罠 つまずきやすいポイントとチェックリスト
Like演算子は書き方自体はシンプルですが、非エンジニアの方がVBAで自己流に使い始めると、共通してつまずくポイントがあります。ここでは代表的な3つの罠と、その回避方法を整理します。
9-1. 罠1:大文字小文字の判定が想定と違う
前述の通り、Like演算子は既定で大文字・小文字を区別する動作をします。「"abc" Like "ABC"」はFalseです。「なぜかヒットしない」と感じたら、まず大文字小文字の違いを疑うのが最初のチェックポイントです。
' 大文字小文字を無視したい場合
Sub CaseInsensitiveLike()
' 方法1: モジュール冒頭に Option Compare Text を宣言する
' (モジュール全体の比較モードが変わる点に注意)
' 方法2: UCase/LCaseで両辺を揃えてから比較する(局所的で安全)
Dim s As String
s = "Report_Final"
Debug.Print UCase(s) Like UCase("report_*") ' True
End Sub
9-2. 罠2:「?」と「*」の使い分けを誤る
「?」は必ず1文字、「*」は0文字以上という違いを混同すると、意図した以上に緩い(または厳しい)条件になってしまいます。特に「文字数が可変のデータに?を使ってしまう」ミスは頻出です。
| やりたいこと | 誤りがちな書き方 | 正しい書き方 |
|---|---|---|
| 先頭が"A"で始まる(文字数不問) | "A?"(1文字しか許容されない) | "A*"(0文字以上を許容) |
| ちょうど3文字の英字コード | "***"(文字数を制限できていない) | "???"(3文字ちょうどに固定) |
9-3. 罠3:否定パターンを「全体否定」だと誤解する
4章で触れた通り、[!charlist]は1文字単位の否定です。「文字列全体にその文字を含まない」という条件だと誤解して使うと、意図しないデータを通過させてしまうバグにつながります。
判定結果
Trueのはずが
False(または逆)
確認
Option Compare
Text の有無
使い分けを確認
文字数固定か
可変長か
範囲を確認
1文字否定か
全体否定か
再検証
Debug.Printで
都度確認
10 WITH CLAUDE CODE Claude CodeにLike演算子のパターン設計を任せる ワイルドカードの組み立て・デバッグを日本語の指示だけで代行させる
ここまで見てきた通り、Like演算子自体はシンプルな仕組みですが、「自分のデータに対してどのパターンを書けば正しく判定できるか」を組み立てる作業には、地味に時間と試行錯誤がかかります。特に、9章で挙げたような「大文字小文字」「?と*の使い分け」「否定パターンの範囲」といった落とし穴を踏まずに一発で正しいパターンを書くのは、VBAに慣れていない人ほどハードルが高いのが実情です。
この「パターンを考えて、コードに落とし込み、テストする」という一連の作業は、Claude Codeのようなエージェント型AIツールに日本語でそのまま依頼できる領域です。サンプルデータと「こういう条件で判定したい」という要件を伝えるだけで、Like演算子を使ったVBAコードを組み立ててもらえます。
📚 用語解説
Claude Code:Anthropic社が提供するAIエージェントツール。チャット形式で「〇〇をやって」と指示するだけで、ファイルの内容を読み取り、コードの作成・修正・実行までを自律的に行う。ターミナル版だけでなく、ターミナル操作が不要なデスクトップ版も提供されており、非エンジニアでも日本語の指示だけで業務を任せられる。
' Claude Codeへの依頼イメージ(実際はチャットで日本語のまま指示するだけ)
' 依頼例:
' 「この商品コード一覧(A0001〜Z9999形式)から、
' 形式に合わないデータだけをハイライトするVBAマクロを書いて。
' 大文字小文字は区別しなくていいです」
' Claude Codeが生成するコード例(形式チェック+ハイライト)
Sub HighlightInvalidCodes()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim i As Long, lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
Dim code As String
code = UCase(ws.Cells(i, 1).Value) ' 大文字小文字を区別しない指定に対応
If Not (code Like "[A-Z]####") Then
ws.Cells(i, 1).Interior.Color = RGB(255, 200, 200)
Else
ws.Cells(i, 1).Interior.ColorIndex = xlNone
End If
Next i
MsgBox "チェック完了:" & lastRow - 1 & "件を確認しました"
End Sub
この依頼の中で、大文字小文字を区別しない要件が「UCase関数で両辺を揃える」という具体的な実装に落とし込まれている点に注目してください。9章で触れたような落とし穴を踏まえたコードが、最初から出力されるのは、ゼロからパターンを組み立てる場合との大きな違いです。
日本語で伝える
サンプルデータ+条件
コード生成
Like演算子/RegExp
を自動で使い分け
動作確認
結果を見ながら
微調整を依頼
組み込み
継続的に利用
弊社では、こうした「決まった形式に沿っているかを確認する」類のVBA業務についても、パターン設計から実装、テストデータでの検証までをClaude Codeに任せる形で運用しています。8章で紹介した経理領域の削減事例も、こうした細かな文字列処理の自動化の積み重ねによるものです。
いきなり複数のマクロをまとめて任せようとせず、「このデータのこの列を、この条件でチェックしたい」という具体的な1つの処理から試すのがおすすめです。サンプルデータをそのまま貼り付けて依頼すると、抽象的な説明だけより精度の高いコードが得られます。
11 CONCLUSION まとめ Like演算子の基本を押さえつつ、パターン設計の負担は仕組みで減らす
この記事では、VBAのLike演算子について、基本構文からワイルドカード4種類(* ? # [charlist])、否定パターン[!charlist]、エスケープ処理、他の文字列関数との使い分け、業務での実践パターンまでを整理しました。最後にポイントを振り返ります。
Like演算子は、正規表現ほど大掛かりな準備をしなくても、日常的な文字列パターンの判定を簡潔に書ける便利な機能です。一方で、大文字小文字の扱いや否定パターンの範囲など、細かい仕様を正確に理解していないと、気づかないうちにデータの見落としを生んでしまうこともあります。まずは本記事のコード例を実際に動かしながら、自分の業務データに当てはめて試してみてください。
VBAのパターン設計・データ検証の自動化、Claude Codeで一緒に進めませんか
「このデータの形式チェックをVBAでやりたいが、どんなパターンを書けばいいかわからない」「既存のLike演算子まわりのコードを見直したい」——弊社AI鬼管理では、Claude Codeを使った業務VBA・Excel自動化の設計から導入までを支援しています。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
よくある質問
Q. Like演算子とInStr関数、どちらを使うべきですか?
A. 「特定の文字列が含まれているかどうか」だけを知りたい場合はInStr関数の方がシンプルで高速です。「先頭が○○で始まる」「桁数が決まった数字の並び」のようなパターン条件を扱いたい場合はLike演算子が適しています。目的に応じて使い分けるのがポイントです。
Q. Like演算子は大文字・小文字を区別しますか?
A. 既定では区別します(バイナリ比較)。モジュールの先頭に"Option Compare Text"を宣言すると、大文字・小文字を区別しないテキスト比較に変わります。一時的に区別をなくしたいだけであれば、UCase関数やLCase関数で両辺を揃えてから比較する方法も使えます。
Q. ワイルドカードの「?」と「*」の違いは何ですか?
A. 「?」は必ず1文字に一致し、「*」は0文字以上の任意の長さに一致します。文字数が固定されているデータには「?」、文字数が可変のデータには「*」を使うのが基本です。混同すると意図しない範囲までマッチしてしまうので注意が必要です。
Q. 否定パターン[!charlist]で「文字列全体にその文字を含まない」ことを判定できますか?
A. できません。[!charlist]はあくまで「1文字」に対する否定です。文字列全体に特定の文字が含まれないことを判定したい場合は、[!charlist]をループで文字数分並べるか、InStr関数を使った判定に切り替える必要があります。
Q. アスタリスク(*)そのものを検索文字として使いたい場合はどうすればいいですか?
A. 角括弧で囲んで"[*]"と書くことで、ワイルドカードとしてではなく、リテラルな1文字の"*"として扱われます。同様に "?" は "[?]"、"#" は "[#]" と書くことでエスケープできます。
Q. Like演算子とRegExp(正規表現)は同時に使い分けてもいいですか?
A. 問題ありません。シンプルなパターン一致にはLike演算子、繰り返し回数の指定やグループ化が必要な複雑な条件にはRegExpという形で、処理内容ごとに使い分けるのが一般的です。1つのプロシージャ内で両方を使うことも珍しくありません。
Q. Like演算子のパターン設計をAIに任せることはできますか?
A. できます。Claude Codeのようなエージェント型AIツールであれば、サンプルデータと判定したい条件を日本語で伝えるだけで、Like演算子やRegExpを使ったVBAコードを生成してもらえます。大文字小文字の扱いなど細かい仕様も含めて考慮したコードが得られやすいのが利点です。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。




