VBAで文字列を扱うとき、
「特定の文字が含まれているかを判定したい」
という場面は非常に多くあります。
例えば、
- 商品名に「在庫切れ」が含まれているか
- メール本文に「至急」が含まれているか
- ファイル名に「2024」が含まれているか
といったケースです。
このような場面では、文字列の部分一致を正しく扱えるかどうかが、処理の安定性を大きく左右します。
一見簡単そうに見える処理ですが、実務では以下のようなトラブルが頻繁に発生します。
- 想定外の文字にも一致してしまう
- 大文字・小文字の違いで判定が失敗する
- 空白や全角半角の違いで不一致になる
- 条件が増えてコードが壊れる
そこで本記事では、
IF文で文字列の部分一致を安全に扱うための実務設計を、具体例とともに解説します。
単なる書き方の紹介ではなく、
「なぜこの方法を選ぶのか」
「どの方法が将来の変更に強いのか」
という観点から整理しています。
目次
- ✅ VBA 文字列の部分一致(IF文)の基本:InStr関数の使い方
- ・InStr関数を使った部分一致判定の基本例
- ・ なぜこの書き方にしているのか
- ・ 別の書き方との比較
- ・ 実務で気をつけるポイント
- ✅ VBA 文字列の部分一致(IF文)でよく使うLike演算子の使い方
- ・Like演算子を使った部分一致の基本例
- ・ ワイルドカードの意味
- ・ なぜこの書き方にしているのか
- ・ 別の方法との比較
- ・ 実務で気をつけるポイント
- ✅ VBA 文字列の部分一致(IF文)で大文字・小文字を無視する方法
- ・LCase関数を使って安全に比較する方法
- ・ なぜこの書き方にしているのか
- ・ 別の方法との比較
- ・ 実務で気をつけるポイント
- ✅ VBA 文字列の部分一致(IF文)を関数化して再利用する設計
- ・部分一致判定を関数として作成する例
- ・ なぜこの書き方にしているのか
- ・ 使用例
- ・ 別の方法との比較
- ・ 実務で気をつけるポイント
- ✅ VBA 文字列の部分一致(IF文)で複数キーワードを扱う実務パターン
- ・配列を使って複数キーワードを管理する方法
- ・ なぜこの書き方にしているのか
- ・ 別の方法との比較
- ・ 実務で気をつけるポイント
- ✅ VBA 文字列の部分一致(IF文)と完全一致の設計判断
- ・部分一致が危険になる典型例
- ・ 安全な設計
- ・ 実務での判断基準
- ・ 実務で最も重要な視点
- ✅VBAを使えば部分一致処理はさらに自動化できる
- ✅ まとめ:VBA 文字列の部分一致(IF文)を安全に使いこなそう
✅ VBA 文字列の部分一致(IF文)の基本:InStr関数の使い方
文字列の部分一致を扱ううえで、最も基本となるのが InStr関数 です。
しかし、実務では「なんとなく使っている」状態のまま運用されているケースが非常に多く、それが後々の不具合につながります。特に、戻り値の意味を正しく理解していないと、「一致しているのに処理されない」「一致していないのに処理される」といった現象が発生します。さらに、Nullや空文字との違いを曖昧にしたまま使うと、条件分岐の信頼性が低下します。ここを曖昧にすると、後から仕様変更が入ったときに修正範囲が広がります。だからこそ、まずはInStr関数の基本動作を確実に理解することが重要です。
・InStr関数を使った部分一致判定の基本例
Sub CheckKeywordInProductName()
Dim productName As String
Dim keyword As String
productName = "在庫切れ商品"
keyword = "在庫"
If InStr(productName, keyword) > 0 Then
MsgBox "キーワードが含まれています"
Else
MsgBox "キーワードは含まれていません"
End If
End Sub
・ なぜこの書き方にしているのか
InStr関数は、
文字列が見つかった位置(数値) を返します。
| 状態 | 戻り値 |
|---|---|
| 見つかった | 1以上 |
| 見つからない | 0 |
つまり、
If InStr(...) > 0 Then
この条件は、
「文字が含まれているか」
を最も安全に判定できる基本形になります。
・ 別の書き方との比較
例えば次のような書き方も見かけます。
If InStr(productName, keyword) Then
これは動作する場合もありますが、
意図が曖昧になります。
実務では必ず、
> 0
を明示する方が安全です。
・ 実務で気をつけるポイント
重要なのは次の点です。
- 戻り値は「True/False」ではない
- 数値であることを理解する
- 0と1以上の違いを明示する
ここを曖昧にすると、
条件分岐の信頼性が崩れます。
✅ VBA 文字列の部分一致(IF文)でよく使うLike演算子の使い方
InStr関数だけでなく、Like演算子も部分一致で頻繁に使われます。特に、あいまい検索やパターン判定が必要な場面では、Likeの方が直感的に書けるケースがあります。ただし、Likeは便利な反面、ワイルドカードの意味を誤解していると想定外の一致が発生します。例えば「*」と「?」の違いを理解していないと、誤検知が発生する原因になります。さらに、将来条件が増えたときに、可読性が急激に低下することもあります。だからこそ、Likeは「便利だから使う」のではなく、「目的に合っているから使う」という判断が重要です。
・Like演算子を使った部分一致の基本例
Sub CheckKeywordWithLike()
Dim messageText As String
messageText = "至急対応してください"
If messageText Like "*至急*" Then
MsgBox "緊急対応が必要です"
End If
End Sub
・ ワイルドカードの意味
| 記号 | 意味 |
|---|---|
| * | 任意の文字列 |
| ? | 任意の1文字 |
・ なぜこの書き方にしているのか
"*至急*"
この書き方は、
前後に何があっても一致する
という意味になります。
つまり、
- 「至急」
- 「至急対応」
- 「本日中に至急」
すべて一致します。
・ 別の方法との比較
| 方法 | 特徴 |
|---|---|
| InStr | 汎用的・柔軟 |
| Like | パターン判定が簡単 |
・ 実務で気をつけるポイント
Likeは非常に便利ですが、
曖昧一致が起きやすいという特徴があります。【VBA】Like演算子で複数条件を扱う方法
例えば:
"*1*"
これは、
- 1
- 10
- 100
- 21
すべて一致します。
つまり、
意図しない一致が発生する
というリスクがあります。
Like演算子は非常に便利ですが、
「どこまで一致させるのか」
「複数条件をどう扱うのか」
といった設計によって、処理の安定性は大きく変わります。
例えば、
「特定の文字から特定の文字までを取り出す」
といった処理では、Likeだけでなく Mid関数やInStr関数 を組み合わせることで、より正確なデータ処理が可能になります。
また、実務では
「複数の条件をまとめて判定したい」
という場面も非常に多く、Like演算子を単純に並べるだけでは、将来的にコードが読みにくくなる原因になります。
次の記事では、
実務で頻繁に使われる「文字列抽出」と「複数条件判定」の設計方法を具体例とともに解説しています。
部分一致をさらに安全に使いこなしたい方は、ぜひあわせてご覧ください。
✅ VBA 文字列の部分一致(IF文)で大文字・小文字を無視する方法
実務では、大文字・小文字の違いによって一致しない問題が頻繁に発生します。特に、ユーザー入力や外部データを扱う場合、入力形式を完全に統一することは現実的ではありません。そのため、「大文字でも小文字でも一致する」処理を最初から設計しておくことが重要になります。ここを後付けで修正すると、既存ロジック全体に影響が出ることがあります。また、データの信頼性が低い環境では、この対策が必須になります。部分一致を扱うなら、必ずこの視点を持っておくべきです。
・LCase関数を使って安全に比較する方法
Sub CheckCaseInsensitive()
Dim inputText As String
Dim keyword As String
inputText = "Error Message"
keyword = "error"
If InStr(LCase(inputText), LCase(keyword)) > 0 Then
MsgBox "エラーが検出されました"
End If
End Sub
・ なぜこの書き方にしているのか
LCase
は、
すべて小文字に変換する
関数です。
つまり、
- Error
- ERROR
- error
すべて同じになります。
・ 別の方法との比較
| 方法 | 特徴 |
|---|---|
| LCase / UCase | 最も安定 |
| Option Compare Text | 環境依存 |
・ 実務で気をつけるポイント
最も安全なのは:
毎回変換する方法
です。
理由:
- 環境に依存しない
- 再利用しやすい
- バグが起きにくい
✅ VBA 文字列の部分一致(IF文)を関数化して再利用する設計
同じ判定処理を何度も書くと、コードは必ず壊れやすくなります。特に、条件が複数の場所に分散していると、仕様変更のたびに修正漏れが発生します。実務では「1回だけ書く」設計が最も重要です。そのためには、処理を関数としてまとめることが不可欠になります。また、関数化することで、テストやデバッグも容易になります。ここは単なるテクニックではなく、長期運用を前提とした設計思想です。
・部分一致判定を関数として作成する例
Function ContainsKeyword(ByVal targetText As String, _
ByVal keyword As String) As Boolean
ContainsKeyword = InStr(LCase(targetText), _
LCase(keyword)) > 0
End Function
・ なぜこの書き方にしているのか
この関数は:
- 大文字・小文字を無視
- 再利用可能
- 読みやすい
という設計になっています。
・ 使用例
Sub CheckMessage()
If ContainsKeyword("至急対応", "至急") Then
MsgBox "優先処理が必要です"
End If
End Sub
・ 別の方法との比較
| 方法 | 問題 |
|---|---|
| 直接書く | 重複する |
| 関数化 | 安定する |
・ 実務で気をつけるポイント
関数化の最大のメリットは:
仕様変更に強くなる
ことです。
例えば:
- 大文字小文字のルール変更
- 全角半角の統一
- トリム処理追加
これらを:
1か所だけ修正
すれば済みます。
関数化は、コードをまとめるだけでなく、
処理の結果をどのように返すか(戻り値)を設計することが非常に重要になります。
戻り値の設計が曖昧なまま関数を増やしてしまうと、
後から処理の流れが分かりにくくなり、修正が難しくなる原因になります。
Functionを「使う」だけでなく、
安全に再利用できる形で設計するための考え方を整理したい方は、
次の記事もあわせて確認しておくことをおすすめします。
✅ VBA 文字列の部分一致(IF文)で複数キーワードを扱う実務パターン
実務では、「1つのキーワード」だけを判定することはほとんどありません。むしろ、「複数の条件をまとめて扱う」ケースが一般的です。例えば、エラー判定、ステータス判定、ファイル分類などでは、複数のキーワードをまとめて管理する必要があります。このとき、条件をIF文で並べるだけでは、可読性が急激に低下します。また、条件追加のたびにコード修正が必要になります。ここを配列で管理できるかどうかが、長期運用の分岐点になります。
・配列を使って複数キーワードを管理する方法
Sub CheckMultipleKeywords()
Dim keywords As Variant
Dim targetText As String
Dim i As Long
keywords = Array("至急", "重要", "緊急")
targetText = "重要なお知らせです"
For i = LBound(keywords) To UBound(keywords)
If InStr(targetText, keywords(i)) > 0 Then
MsgBox "対応が必要です"
Exit For
End If
Next i
End Sub
・ なぜこの書き方にしているのか
この設計は:
条件をデータとして管理する
という考え方です。
・ 別の方法との比較
悪い例:
If InStr(text, "至急") > 0 _
Or InStr(text, "重要") > 0 _
Or InStr(text, "緊急") > 0 Then
問題:
- 条件が増えるほど読みにくい
- 修正が大変
- バグが増える
・ 実務で気をつけるポイント
重要なのは:
条件をコードではなくデータで管理する
ことです。
これは、
再利用性
を大きく向上させます。
✅ VBA 文字列の部分一致(IF文)と完全一致の設計判断
部分一致は便利ですが、すべての場面で使うべきではありません。特に、IDやコード、ステータスなどの厳密な判定が必要な場面では、部分一致は危険になります。例えば「完了」という文字列を判定したい場合、「未完了」にも一致してしまう可能性があります。このような誤判定は、業務上の重大なミスにつながります。だからこそ、部分一致と完全一致を使い分ける判断力が重要になります。この判断は、単なる技術ではなく、業務理解そのものです。
・部分一致が危険になる典型例
If InStr(status, "完了") > 0 Then
この条件は:
- 完了
- 未完了
両方に一致します。
・ 安全な設計
If status = "完了" Then
部分一致は柔軟な判定ができる一方で、
誤判定を防ぐためには完全一致を選ぶべき場面が必ず存在します。
特に、
ステータスや識別コードなど、
「正確さ」が求められるデータでは、
完全一致の扱い方を正しく理解しておくことが重要になります。
完全一致を安全に実装するための基本と実務上の注意点を整理したい方は、
【VBA】文字列の完全一致の処理(IF文)|誤判定を防ぐ比較方法と実務設計のポイントの記事もあわせて確認しておくことをおすすめします。
・ 実務での判断基準
| 場面 | 方法 |
|---|---|
| ID | 完全一致 |
| ステータス | 完全一致 |
| メッセージ | 部分一致 |
| ファイル名 | 部分一致 |
・ 実務で最も重要な視点
これは非常に重要です。
部分一致は便利だが危険
この認識を持つことが、
安定したシステムを作る第一歩です。
✅VBAを使えば部分一致処理はさらに自動化できる
もし、部分一致判定を頻繁に行っているなら、
VBAによる自動化を検討する価値があります。
例えば:
- 特定キーワードを含む行だけ抽出
- エラー内容を自動分類
- メール本文を自動判定
- ファイルを自動振り分け
これらはすべて、
部分一致判定の応用
です。
特に、
- 毎日同じ確認作業をしている
- 手作業でフィルターしている
- 条件が増えて管理が大変
このような状況であれば、
VBAは非常に強力な解決策になります。
✅ まとめ:VBA 文字列の部分一致(IF文)を安全に使いこなそう
文字列の部分一致は、VBAで最もよく使う処理の1つです。
しかし、便利な反面、誤判定や仕様変更に弱い設計になりやすいという特徴もあります。だからこそ、「動けばOK」ではなく、「長く使える設計」を最初から意識することが重要です。
- InStrは最も基本で安全な部分一致関数
- Likeはパターン判定に向いている
- 大文字・小文字の違いは必ず考慮する
- 条件は関数化して再利用する
- 複数条件は配列で管理する
- 部分一致と完全一致は必ず使い分ける
これらを意識するだけで、
コードの信頼性は大きく向上します。
そして何より重要なのは:
条件判定は「業務設計」そのもの
だということです。
部分一致を正しく扱えるようになれば、
VBAの実用性は一気に広がります。