VBAで業務を自動化していると、
「この文字が含まれていたら処理を実行したい」
「特定のキーワードが入っているか確認したい」
といった場面は非常に多くあります。
たとえば:
- 「エラー」という文字が含まれていたらログに記録する
- 「東京」が含まれていたら担当部署を振り分ける
- 「未処理」が含まれていたら再確認する
このような処理は、完全一致ではなく部分一致が必要になります。
しかし実務では、
- 条件が増えてコードが読みにくくなる
- 想定外の文字まで一致してしまう
- パフォーマンスが悪くなる
- 修正が難しくなる
といった問題が発生しやすい分野でもあります。
この記事では、
VBAにおける文字列の部分一致(IF文)について、
- Like演算子とInStr関数の使い分け
- 実務で壊れない条件設計
- 保守性・再利用性を意識した実装方法
まで含めて、実務目線で解説します。
目次
- ✅ VBA 文字列の部分一致の基本|IF文で最初に覚える条件分岐
- ・基本構文:Like演算子を使った部分一致
- ・ この構文の意味
- ・ なぜLike演算子が最初に使われるのか
- ✅ Like演算子のワイルドカードを理解する|部分一致の仕組みを正しく使う
- ・主なワイルドカード一覧
- ・使用例
- ・ 実務での重要ポイント
- ✅ InStr関数を使った部分一致|柔軟で高速な検索処理を実現する
- ・基本構文:InStr関数
- ・ この書き方の意味
- ・ なぜ「> 0」なのか
- ・ 実務での使い分け
- ✅ 複数条件の部分一致を安全に設計する|条件が増えても壊れない書き方
- ・基本例:OR条件を使った複数判定
- ・ この書き方の問題点
- ・改善例:配列を使った設計
- ・ なぜこの書き方にしているのか(設計意図)
- ・ 実務でのメリット
- ✅ 部分一致の処理を関数化する設計|再利用性と可読性を向上させる
- ・Function化した安全な部分一致
- ・ この設計のメリット
- ・ 実務での重要ポイント
- ✅ 実務で最も重要な判断:部分一致を使うべき場面と使わない場面
- ・部分一致を使う場面
- ・部分一致を使わない場面
- ✅ まとめ:VBA 文字列の部分一致は「便利」ではなく「設計」で決まる
✅ VBA 文字列の部分一致の基本|IF文で最初に覚える条件分岐
文字列の部分一致は、検索・分類・判定など、ほぼすべての業務で使用される重要な処理です。
しかし、「なんとなく動くコード」で済ませてしまうと、後から仕様変更が発生したときに修正が難しくなることがあります。
特に、文字列の扱いは入力データに依存するため、環境や担当者が変わると動作が変わることも珍しくありません。
また、部分一致は便利な反面、想定外の一致を引き起こすリスクもあります。
ここで基本的な仕組みを理解しておかないと、トラブルの原因を特定するのに時間がかかってしまいます。
まずは、安全で分かりやすい基本形を確実に押さえておきましょう。
ここが後の設計の土台になります。
・基本構文:Like演算子を使った部分一致
Dim commentText As String
commentText = Range("A2").Value
If commentText Like "*エラー*" Then
MsgBox "エラーが含まれています。"
End If
・ この構文の意味
*エラー*
は:
前後にどんな文字があっても「エラー」が含まれていれば一致する
という意味になります。
・ なぜLike演算子が最初に使われるのか
理由は非常にシンプルです。
直感的で読みやすい
つまり:
保守しやすい
ということです。
✅ Like演算子のワイルドカードを理解する|部分一致の仕組みを正しく使う
部分一致の精度は、ワイルドカードの理解に大きく依存します。
ここを曖昧にしたまま使い続けると、意図しないデータまで一致してしまうことがあります。
たとえば、「東京」という文字を探しているつもりでも、「東京都」や「東京支店」など、すべて一致してしまう可能性があります。
これは仕様として正しい場合もありますが、誤判定になる場合もあります。
つまり、部分一致は「便利」ではありますが、「曖昧」でもあるということです。
そのため、どの範囲まで一致させるのかを明確にすることが重要になります。
ここでは、最もよく使うワイルドカードを整理しておきましょう。
・主なワイルドカード一覧
* :任意の文字列
? :任意の1文字
# :任意の数字1文字
・使用例
If productCode Like "A*" Then
意味:
Aから始まるすべてのコードに一致
If employeeCode Like "??-###" Then
意味:
AA-123 のような形式に一致
・ 実務での重要ポイント
ワイルドカードは「仕様」を表す
つまり:
コードではなく業務ルールを記述している
という意識が重要です。
ワイルドカードの仕組みはVBAだけでなく、Excelの検索や置換機能でも同じように活用できます。
「」や「?」を使った柔軟な文字列操作については、「【Excel】置換でワイルドカードを使いこなす方法|「*」「?」で柔軟な文字列操作を実現」もあわせて確認しておくと、日常業務の効率化に大きく役立ちます。
✅ InStr関数を使った部分一致|柔軟で高速な検索処理を実現する
Like演算子は分かりやすい反面、複雑な条件になると読みにくくなることがあります。
また、大量データを処理する場合には、パフォーマンスの違いが問題になることもあります。
そのような場面では、InStr関数を使うことで、より柔軟で効率的な検索処理を実装することができます。
特に、検索位置を取得したい場合や、条件を細かく制御したい場合には非常に有効です。
ただし、使い方を誤ると、条件が分かりにくくなることもあります。
つまり、LikeとInStrは優劣ではなく、用途によって使い分けるべきものです。
ここでは、基本的な使い方と設計上の意味を確認しておきましょう。
・基本構文:InStr関数
If InStr(commentText, "エラー") > 0 Then
MsgBox "エラーが検出されました。"
End If
・ この書き方の意味
文字列の中に「エラー」が見つかったら処理する
・ なぜ「> 0」なのか
見つからない → 0
見つかった → 1以上
だからです。
・ 実務での使い分け
読みやすさ重視 → Like
処理性能・制御重視 → InStr
InStr関数は、文字が含まれているかどうかを判定するだけでなく、「どの位置にあるか」を取得できる点が大きな特徴です。
この位置情報を活用して、特定の文字から別の文字までを抽出する方法については、「【VBA】特定の文字から特定の文字までを抽出する方法|Mid・InStrで実務対応」もあわせて確認しておくと、文字列処理の応用力が大きく向上します。
✅ 複数条件の部分一致を安全に設計する|条件が増えても壊れない書き方
部分一致は、条件が1つのときは簡単ですが、複数になると急激に複雑になります。
たとえば、「エラー」「警告」「未処理」など、複数の状態を同時に判定する場面は非常に多くあります。
このとき、単純に条件を並べていくと、コードが読みにくくなり、修正も難しくなります。
また、条件の追加や変更が発生すると、思わぬバグが入り込む可能性もあります。
つまり、条件が増えることを前提にした設計が必要になります。
この視点を持っていないと、将来の保守コストが大きくなります。
ここでは、安全で拡張しやすい書き方を確認していきましょう。
・基本例:OR条件を使った複数判定
If commentText Like "*エラー*" _
Or commentText Like "*警告*" _
Or commentText Like "*未処理*" Then
MsgBox "対応が必要です。"
End If
・ この書き方の問題点
条件が増えると読みづらくなる
・改善例:配列を使った設計
Dim keywords As Variant
Dim i As Long
keywords = Array("エラー", "警告", "未処理")
For i = LBound(keywords) To UBound(keywords)
If commentText Like "*" & keywords(i) & "*" Then
MsgBox "対応が必要です。"
Exit For
End If
Next i
・ なぜこの書き方にしているのか(設計意図)
条件をデータとして管理している
つまり:
コードを書き換えなくても条件を追加できる
ということです。
・ 実務でのメリット
仕様変更に強い
これは非常に重要です。
条件が増えてきたときに重要になるのは、単にコードを書くことではなく、「どのように条件を組み合わせるか」という設計の考え方です。
AND条件やOR条件を安全に整理する方法については、「【VBA】IF文のandとorを組み合わせた複数条件|実務で迷わない条件設計」もあわせて確認しておくと、複雑な条件分岐でも壊れにくいコードを書けるようになります。
✅ 部分一致の処理を関数化する設計|再利用性と可読性を向上させる
同じような部分一致の処理が複数の場所に存在すると、修正が必要になったときに大きな負担になります。
たとえば、検索ルールが変わった場合、すべてのコードを探して修正しなければならなくなります。
これは、保守性の観点から非常に危険な状態です。
また、同じロジックが複数の場所に存在すると、バグの原因にもなりやすくなります。
そのため、重要な処理は関数として切り出し、再利用できる形にすることが推奨されます。
この考え方は、小規模なマクロでも大規模なシステムでも共通です。
ここでは、安全に再利用できる設計例を紹介します。
・Function化した安全な部分一致
Function ContainsKeyword(ByVal inputText As String, _
ByVal searchWord As String) As Boolean
Dim normalizedText As String
' 前後のスペースを削除
normalizedText = Trim(inputText)
' 部分一致を判定
If normalizedText Like "*" & searchWord & "*" Then
ContainsKeyword = True
Else
ContainsKeyword = False
End If
End Function
・ この設計のメリット
比較ルールを1か所にまとめられる
・ 実務での重要ポイント
関数は「再利用」のためではなく「統一」のために作る
ここが設計の本質です。
部分一致が便利な場面も多い一方で、IDやコードなどのように厳密な一致が求められる業務では、完全一致の処理を確実に実装することが重要になります。
安全に判定を行うための基本的な書き方については、「【VBA】文字列の完全一致の処理(IF文)|実務で壊れない条件分岐の基本設計」もあらためて確認しておきましょう。
✅ 実務で最も重要な判断:部分一致を使うべき場面と使わない場面
部分一致は便利ですが、すべての場面で使うべきではありません。
特に、IDやコード、数値などの厳密な判定が必要な場合には、部分一致は危険になることがあります。
たとえば、「123」を探している場合、「1234」も一致してしまう可能性があります。
これは、重大な業務ミスにつながることもあります。
つまり、部分一致は「便利な道具」であり、「万能」ではありません。
ここで、使うべき場面と避けるべき場面を整理しておくことが重要です。
この判断が、安定した業務システムを作るための鍵になります。
・部分一致を使う場面
コメント検索
住所検索
キーワード判定
エラー判定
・部分一致を使わない場面
社員番号
商品コード
ID
ステータスコード
✅ まとめ:VBA 文字列の部分一致は「便利」ではなく「設計」で決まる
今回の内容を整理すると、文字列の部分一致は単なる検索処理ではなく、
業務ロジックの柔軟性と安全性を左右する重要な技術であることが分かります。
- Like演算子は直感的で読みやすい
- InStr関数は柔軟で高速な検索が可能
- 条件が増えることを前提に設計する
- 配列を使うと拡張性が高くなる
- 関数化すると保守性が向上する
- 部分一致は使う場面を選ぶ必要がある
そして最も重要なのは:
部分一致は「書き方」ではなく「業務判断」で決まる
という視点です。
この考え方を持って設計することで、
将来の仕様変更や引き継ぎにも強い、
壊れないVBAコードを作ることができるようになります。