VBAで業務を自動化していると、
「この文字列と完全に一致したときだけ処理する」
という条件判定は非常に頻繁に登場します。
たとえば、
- ステータスが「完了」のときだけ次の処理を実行する
- 部署名が「営業部」のときだけメールを送信する
- ファイル名が「売上.csv」と一致した場合のみ取り込む
といった場面です。
しかし実務では、
「見た目は同じなのに一致しない」
というトラブルが非常に多く発生します。
原因の多くは、
- 空白が含まれている
- 全角と半角が混在している
- 大文字と小文字が違う
- 改行コードが含まれている
といった、
目に見えない違いです。
そしてこの問題は、
単なる文法の問題ではなく、
設計の問題です。
本記事では、
- VBAで文字列の完全一致を判定する基本
- 実務で起きる典型的な失敗
- 誤判定を防ぐ安全な書き方
- 再利用しやすい設計方法
まで、実務視点で体系的に解説します。
目次
- ✅ VBAで文字列の完全一致を判定する基本(IF文)
- ・基本的な完全一致の書き方
- ・ 完全一致とは何か(重要)
- ✅ 文字列の完全一致が失敗する典型的な原因
- ・原因① 空白が含まれている
- ・ 実務でよくある原因
- ・原因② 大文字と小文字の違い
- ・原因③ 改行コードが含まれている
- ✅ Trim関数を使って安全に完全一致を行う
- ・空白を除去して比較する方法
- ・ なぜこの書き方にするのか
- ・ 別の書き方(危険)
- ✅ 大文字小文字を無視して完全一致を行う方法
- ・LCase関数を使う方法
- ・ なぜこの書き方が良いのか
- ・ 別案(UCase)
- ✅ StrComp関数を使った安全な完全一致判定
- ・基本形
- ・大文字小文字を区別する
- ・大文字小文字を区別しない
- ・ なぜStrCompを使うのか
- ・ 別案(=)
- ✅ 完全一致判定を関数化する(再利用設計)
- ・関数化した例
- ・ なぜ関数化するのか
- ・ 例えば将来
- ✅ 実務で最も重要な設計判断:完全一致か部分一致か
- ・完全一致が必要なケース
- ・部分一致が適切なケース
- ・ よくある失敗
- ・ 実務の判断
- ✅ よくある危険な実装パターン(実務注意)
- ・危険① マジック文字列
- ・ なぜこの書き方にするのか
- ・危険② Null未対応
- ✅ 実務での典型的な使用例(業務パターン)
- ・ステータス判定
- ・ファイル名チェック
- ・部署判定
- ・エラーメッセージ判定
- ✅ まとめ:文字列の完全一致は「比較の設計」で品質が決まる
✅ VBAで文字列の完全一致を判定する基本(IF文)
文字列の完全一致は、
最も基本的なIF文で実装できます。
しかし、
「完全一致とは何か」
を正しく理解していないと、後からトラブルになります。
ここを読まないと、
「なぜ一致しないのか分からない」
という状態に陥ります。
実務では、
見た目ではなく内部データで判断される
という前提を必ず理解しておきましょう。
・基本的な完全一致の書き方
If statusText = "完了" Then
MsgBox "処理を実行します"
End If
これは最もシンプルな書き方です。
このコードは、
statusText が
完全に「完了」と一致したときだけ
処理を実行します。
・ 完全一致とは何か(重要)
完全一致とは、
- 文字
- 空白
- 記号
- 大文字小文字
- 全角半角
すべてが一致している状態です。
つまり、
一致する:
完了
一致しない:
完了␣
␣完了
完了
完了\n
ここが最も重要なポイントです。
✅ 文字列の完全一致が失敗する典型的な原因
実務で「一致しない」問題は、
ほぼこの章の内容が原因です。
特に、
- CSV
- ユーザー入力
- 外部システム連携
では非常に高確率で発生します。
ここを理解していないと、
デバッグに何時間もかかることがあります。
・原因① 空白が含まれている
If Cells(1, 1).Value = "完了" Then
セルの中身:
完了␣
これだけで一致しません。
・ 実務でよくある原因
- コピー&ペースト
- CSV取り込み
- 手入力
- システム出力
特にCSVは危険です。
・原因② 大文字と小文字の違い
If userName = "ADMIN" Then
一致しない:
admin
Admin
ADMIN␣
英字を扱う業務では、
この問題は非常に多いです。
・原因③ 改行コードが含まれている
これは非常に見つけにくい原因です。
完了\n
見た目では分かりません。
特にCSVファイルを扱う業務では、
空白・改行・文字コードの違いによって一致判定が失敗するケースが非常に多く発生します。
CSVの読み取りや保存処理を安全に設計する方法については、
「【Excel VBA】CSVデータを簡単に読み取り・保存する実務設計ガイド」で詳しく解説しています。
✅ Trim関数を使って安全に完全一致を行う
実務では、
比較前にデータを整形する
ことが重要です。
ここを怠ると、
誤判定の原因になります。
・空白を除去して比較する方法
If Trim(statusText) = "完了" Then
MsgBox "処理を実行します"
End If
・ なぜこの書き方にするのか
理由:
ユーザー入力は信用できないから
です。
これは非常に重要な設計思想です。
・ 別の書き方(危険)
If statusText = "完了" Then
これは動きますが、
- 空白
- 改行
に弱いです。
実務の判断
基本:
比較前に整形する
これが鉄則です。
なお、空白を除去して比較するだけでなく、
そもそも値が空白だった場合にどう処理するかを設計しておくことも重要です。
空白データを安全にスキップする具体的な実装方法については、
「【VBA】IF文で空白なら次の処理をさせる方法|スキップ処理と安全な条件分岐を実務目線で解説」で詳しく解説しています。
✅ 大文字小文字を無視して完全一致を行う方法
英字を扱う業務では、
この対応はほぼ必須です。
・LCase関数を使う方法
If LCase(userName) = "admin" Then
MsgBox "管理者です"
End If
・ なぜこの書き方が良いのか
理由:
比較条件を統一できるからです。
・ 別案(UCase)
If UCase(userName) = "ADMIN" Then
どちらでも構いません。
・ 実務の判断
チーム開発では、
全部小文字
などルールを統一します。
✅ StrComp関数を使った安全な完全一致判定
ここからが
実務レベルです。
StrCompは、
比較方法を明示できる
という大きなメリットがあります。
・基本形
If StrComp(text1, text2) = 0 Then
・大文字小文字を区別する
If StrComp(text1, text2, vbBinaryCompare) = 0 Then
・大文字小文字を区別しない
If StrComp(text1, text2, vbTextCompare) = 0 Then
・ なぜStrCompを使うのか
理由:
比較ルールを明示できる
からです。
・ 別案(=)
If text1 = text2 Then
これは:
- 短い
- 分かりやすい
しかし:
- ルールが不明確
実務の判断
重要な比較:
StrComp
単純な比較:
=
✅ 完全一致判定を関数化する(再利用設計)
ここが
保守性の核心です。
同じ比較を何度も書くのは危険です。
・関数化した例
Function IsExactMatch(ByVal sourceText As String, _
ByVal targetText As String) As Boolean
Dim normalizedSource As String
Dim normalizedTarget As String
normalizedSource = Trim(sourceText)
normalizedTarget = Trim(targetText)
If StrComp(normalizedSource, _
normalizedTarget, _
vbTextCompare) = 0 Then
IsExactMatch = True
Else
IsExactMatch = False
End If
End Function
・ なぜ関数化するのか
理由:
仕様変更に強くなる
からです。
・ 例えば将来
変更:
- 全角半角を無視
- 改行を除去
- 特殊文字を除去
この場合:
1か所修正
で済みます。
✅ 実務で最も重要な設計判断:完全一致か部分一致か
これは
文法ではなく設計です。
・完全一致が必要なケース
- ステータス
- コード
- ID
- 権限
- ファイル名
・部分一致が適切なケース
- 検索
- キーワード
- コメント
- 備考
・ よくある失敗
完全一致で検索してしまう
・ 実務の判断
まず決める:
一致の定義
ここまで解説したように、
文字列比較では「完全一致」と「部分一致」を正しく使い分けることが重要です。
部分的に一致しているかを判定する具体的な方法については、
「【VBA】文字列の部分一致(IF文)」で実務例を交えて詳しく解説しています。
✅ よくある危険な実装パターン(実務注意)
・危険① マジック文字列
If status = "完了" Then
改善:
Const STATUS_COMPLETE As String = "完了"
If status = STATUS_COMPLETE Then
・ なぜこの書き方にするのか
理由:
変更に強い
・危険② Null未対応
If value = "完了" Then
改善:
If Not IsNull(value) Then
✅ 実務での典型的な使用例(業務パターン)
・ステータス判定
If Trim(status) = "完了" Then
・ファイル名チェック
If fileName = "売上.csv" Then
・部署判定
If department = "営業部" Then
・エラーメッセージ判定
If message = "ERROR" Then
✅ まとめ:文字列の完全一致は「比較の設計」で品質が決まる
重要なポイント:
- 完全一致は最も基本だが最も事故が多い
- 見た目ではなく内部データで比較される
- Trimはほぼ必須
- StrCompは安全
- 関数化すると保守性が上がる
- 一致の定義を最初に決める