Excel VBAで文字列を比較するとき、「ABC」と「abc」を同じ文字として扱いたい場面は少なくありません。
例えば、
- メールアドレスを比較する
- 商品コードを検索する
- 社員IDを照合する
- CSVファイルを取り込んで一致判定する
といった実務では、大文字・小文字の違いだけで別データとして扱ってしまうと、検索漏れや重複登録の原因になります。
このようなケースでは、LCase関数やUCase関数を利用して文字列を統一してから比較する方法が非常によく使われます。
この記事では、LCase・UCaseの基本的な使い方だけではなく、実務で保守しやすいコードの書き方や、StrComp・Option Compare Textとの違いまで分かりやすく解説します。
✅ VBAで大文字・小文字を区別しない比較が必要になる理由
文字列比較は「一致しているかどうか」だけを考えがちですが、実務では入力する人や取り込むシステムによって文字の表記が統一されていないことがよくあります。
例えば、同じメールアドレスでも大文字で入力する人と小文字で入力する人がいます。
そのまま比較すると、本来は同じデータなのに別データとして扱われてしまうことがあります。
この問題はテストデータでは気付きにくく、本番運用を始めてから判明するケースも珍しくありません。
そのため、比較処理を書く段階で「大文字・小文字をどう扱うか」を決めておくことが重要です。
・大文字・小文字を区別すると起こる問題
例えば、次のようなデータがあるとします。
| 入力値 | 検索値 |
|---|---|
| Excel | excel |
| ADMIN | admin |
| Tokyo | TOKYO |
このようなデータを通常の比較で判定すると、一致しないケースがあります。
結果として、
- 同じ社員が二重登録される
- 商品検索でヒットしない
- マスタ照合に失敗する
- データ更新されない
など、実務では見逃せないトラブルにつながります。
特にCSVやWebシステムから取得したデータでは、大文字・小文字が混在していることも多いため注意が必要です。
・実務では入力内容を統一できないことが多い
理想的には、すべて小文字で入力してもらえば問題ありません。
しかし実際には、
- 手入力
- 他システムからの取込
- コピー&ペースト
- 海外システムとの連携
などがあるため、入力ルールだけで防ぐことは困難です。
そのため実務では、
「比較する前に文字列を統一する」
という考え方がよく採用されます。
LCase・UCaseは、この前処理を簡単に実現できる関数です。
✅ LCase関数・UCase関数とは
LCase関数とUCase関数は、文字列のアルファベットを小文字または大文字へ変換する関数です。
一見すると表示を変えるだけの関数に思えますが、実務では比較処理の前準備として利用されることが非常に多くあります。
特にデータ検索や重複チェックでは、「比較条件を統一する」という目的で使用するケースが一般的です。
ここでは、それぞれの役割を整理しておきましょう。
・LCase関数は文字列を小文字へ変換する
LCaseは、英字をすべて小文字へ変換します。
例えば、
Debug.Print LCase("Excel")
実行結果
excel
となります。
大文字だけでなく、
Debug.Print LCase("ExCeL")
も
excel
へ変換されます。
数字や記号、日本語はそのまま保持されます。
・UCase関数は文字列を大文字へ変換する
反対にUCaseは英字をすべて大文字へ変換します。
Debug.Print UCase("Excel")
実行結果
EXCEL
こちらも、
Debug.Print UCase("ExCeL")
なら、
EXCEL
になります。
LCaseでもUCaseでも比較結果は同じになるため、
- 小文字へ統一する
- 大文字へ統一する
どちらでも問題ありません。
実務ではチーム内でルールを統一しておくことが大切です。
UCase関数の基本構文や、セル内の文字列を大文字へ統一する具体的な方法を確認したい方は、UCase関数の使い方を詳しく解説した【VBA】UCase関数で文字列を大文字に変換する方法|実務で役立つ活用例も解説も参考にしてください。
✅ LCase・UCaseで比較するときの基本的な書き方
LCase・UCaseは単独で使うよりも、文字列比較と組み合わせて利用するケースがほとんどです。
ただ比較できればよいという書き方ではなく、後から処理内容が分かりやすく、修正しやすいコードにしておくことが重要です。
ここでは実務でも使いやすい書き方を紹介します。
・比較前に文字列を統一する設計が保守しやすい
次のコードでは、比較する前に両方とも小文字へ変換しています。
Sub CompareIgnoreCase()
'==========================================
' 目的:大文字・小文字を区別せず比較する
'==========================================
Dim inputText As String
Dim targetText As String
inputText = "Excel"
targetText = "excel"
'比較前に小文字へ統一する
If LCase(inputText) = LCase(targetText) Then
MsgBox "一致しました"
Else
MsgBox "一致しません"
End If
End Sub
・なぜ比較前に統一する書き方がおすすめなのか
このコードでは、比較するときだけ小文字へ変換する設計にしています。
例えば、
If inputText = targetText Then
では、
Excel
excel
を一致と判定できません。
一方でLCaseを利用すると、
excel
excel
として比較できるため、大文字・小文字の違いを気にする必要がなくなります。
また、変数そのものを書き換えていないため、後続処理では元の文字列をそのまま利用できます。
例えば、
- 画面表示
- ログ出力
- CSV保存
では元の表記を維持したまま処理を続けられるため、保守性も高くなります。
・実務では比較対象だけを変換するのがおすすめ
LCase関数は、
inputText = LCase(inputText)
のように元データを書き換えることもできます。
しかし実務では、この方法はあまりおすすめできません。
元データを変更してしまうと、
- 表示内容が変わる
- 後続処理へ影響する
- デバッグしにくくなる
といった問題が発生しやすくなるためです。
そのため、
「比較するときだけ変換する」
という設計にすると、流用しやすく安全なコードになります。
大文字・小文字を統一した後にIF文で完全一致を判定する考え方は、文字列の完全一致を安全に処理する方法でも詳しく解説しています。⇒【VBA】文字列の完全一致の処理(IF文)|実務で壊れない条件分岐の基本設計
✅ VBAでUCaseを使って大文字・小文字を区別せず比較する
LCaseだけでなく、UCaseを使って両方の文字列を大文字へ統一しても、同じように比較できます。
どちらを選んでも判定結果は基本的に変わりませんが、コード内で変換方法が混在すると、処理の意図が分かりにくくなります。
特に複数人で保守するマクロでは、担当者ごとにLCaseとUCaseを使い分けると、統一ルールを確認する手間が増えます。
そのため、プロジェクトや処理単位で「比較時は小文字へ統一する」「コード値は大文字へ統一する」といった方針を決めておくことが重要です。
ここでは、商品コードの照合を例に、UCaseを使った実務向けの書き方を紹介します。
単に一致判定するだけでなく、後から条件や処理を追加しやすい構成にしておきましょう。
・商品コードを大文字へ統一して判定する実務例
商品コードや社員IDなどは、一般的に大文字表記で管理されることが多いため、UCaseで統一するとコードの意味が伝わりやすくなります。
Sub CheckProductCode()
Dim enteredProductCode As String
Dim masterProductCode As String
Dim normalizedEnteredCode As String
Dim normalizedMasterCode As String
enteredProductCode = "ab-100"
masterProductCode = "AB-100"
'元の値を残したまま、比較専用の値を大文字へ統一する
normalizedEnteredCode = UCase$(Trim$(enteredProductCode))
normalizedMasterCode = UCase$(Trim$(masterProductCode))
If normalizedEnteredCode = normalizedMasterCode Then
MsgBox "商品コードが一致しました。", vbInformation
Else
MsgBox "商品コードが一致しません。", vbExclamation
End If
End Sub
・比較専用の変数を用意する理由
このコードでは、入力値を直接書き換えず、比較専用の変数へ変換結果を格納しています。
短く書くなら、次のように1行で比較することもできます。
If UCase$(Trim$(enteredProductCode)) = UCase$(Trim$(masterProductCode)) Then
ただし、実務では比較条件が増えることがあります。
例えば、
- 前後の空白を除去する
- ハイフンを削除する
- 全角・半角を統一する
- ログへ正規化後の値を残す
といった処理を追加する場合、比較式へ関数を詰め込みすぎると読みづらくなります。
比較専用の変数を用意しておけば、どのような前処理を行ったかが分かりやすく、デバッグもしやすくなります。
・Trimも組み合わせて入力揺れを減らす
実務データでは、大文字・小文字だけでなく、前後に不要な空白が含まれていることがあります。
例えば、
AB-100
AB-100
AB-100
は見た目がほぼ同じでも、文字列としては異なります。
そのため、手入力値を比較する場合は、LCaseやUCaseだけでなくTrimも組み合わせると安全です。
ただし、文字列の途中にある空白まで削除してよいかは、データの意味によって異なります。
氏名や住所などでは途中の空白が必要な場合もあるため、「すべての空白を削除する」という処理を無条件で追加しないようにしましょう。
大文字・小文字だけでなく、前後の空白や文字列中のスペースも比較結果へ影響する場合は、Trim関数とReplace関数の使い分けも確認しておきましょう。⇒【VBA】スペースを一括削除する方法|Replace関数・Trim関数の使い分けと実務活用
✅ LCase・UCaseとStrCompの違いを理解する
大文字・小文字を区別しない方法として、LCase・UCase以外にStrComp関数もあります。
どちらも同じ目的で使えるため、違いを理解せずにコードへ混在させると、処理方針が曖昧になります。
LCase・UCaseは文字列を変換してから通常の演算子で比較する方法です。
一方、StrCompは比較方法を引数で指定し、文字列を直接比較します。
短いコードだけを見ればStrCompが便利に見えますが、戻り値の意味を知らない担当者には分かりにくいことがあります。
処理の分かりやすさと柔軟性のどちらを重視するかで使い分けましょう。
・StrCompで大文字・小文字を区別せず比較する
StrCompでは、第3引数にvbTextCompareを指定すると、大文字・小文字を区別せず比較できます。
Sub CompareTextWithStrComp()
Dim inputText As String
Dim targetText As String
Dim comparisonResult As Long
inputText = "Excel"
targetText = "excel"
'テキスト比較を明示して、大文字・小文字を区別しない
comparisonResult = StrComp(inputText, targetText, vbTextCompare)
If comparisonResult = 0 Then
MsgBox "文字列は一致しています。", vbInformation
Else
MsgBox "文字列は一致していません。", vbExclamation
End If
End Sub
StrCompの戻り値は、次のように判定されます。
| 戻り値 | 意味 |
|---|---|
| -1 | 1つ目の文字列が小さい |
| 0 | 2つの文字列が一致 |
| 1 | 1つ目の文字列が大きい |
| Null | 比較対象にNullが含まれる |
完全一致だけを確認する場合は、戻り値が0かどうかを判定します。
・LCase・UCaseの方が読みやすい場面
LCase・UCaseは、変換後の文字列を=で比較するため、VBAに慣れていない人でも処理内容を理解しやすい方法です。
If LCase$(inputText) = LCase$(targetText) Then
この書き方は、「両方を小文字にして一致確認している」と直感的に読み取れます。
一方、StrCompは比較方法を明示でき、大小関係も取得できるというメリットがあります。
実務では、次のように使い分けると整理しやすくなります。
- 単純な完全一致:LCase・UCase
- 比較方法をコード上で明示したい:StrComp
- 並び順や大小関係も判定したい:StrComp
- 比較前に空白除去などの加工も行う:LCase・UCaseと正規化処理
どちらが常に優れているわけではなく、コードを読む人が意図を理解しやすい方法を選ぶことが重要です。
比較方法を引数で明示したい場合や、文字列の大小関係まで判定したい場合は、StrComp関数の使い方も確認してみてください。⇒【VBA】StrComp関数の活用|文字列比較を安全・正確に行う実務テクニック
✅ Option Compare Textで区別しない方法との使い分け
モジュールの先頭にOption Compare Textを記述すると、そのモジュール内の文字列比較で大文字・小文字を区別しなくなります。
一見すると毎回LCaseやUCaseを書く必要がなく便利ですが、適用範囲がモジュール全体になる点には注意が必要です。
ある処理では区別したくなくても、別の処理では厳密に区別したい場合があります。
そのようなモジュールで設定すると、意図しない比較結果を生む可能性があります。
また、コードの途中だけを読んだ人には、モジュール先頭の設定が見えず、なぜ一致したのか分かりにくいこともあります。
便利さだけで選ばず、比較ルールをどこまで広げてよいかを考えましょう。
・Option Compare Textの基本的な動作
モジュールの先頭へ次のように記述します。
Option Compare Text
Option Explicit
この状態では、次の比較が一致します。
Sub CheckOptionCompareText()
Dim firstText As String
Dim secondText As String
firstText = "Excel"
secondText = "excel"
If firstText = secondText Then
MsgBox "一致しました。", vbInformation
End If
End Sub
コード内ではLCaseやUCaseを使っていませんが、Option Compare Textの設定によって大文字・小文字を区別しません。
・局所的な比較では関数を使う方が安全
Option Compare Textは、モジュール全体で比較ルールを統一したい場合には便利です。
しかし、実務では次のようなデータが同じモジュール内に混在することがあります。
- メールアドレスは区別しない
- パスワードは区別する
- 商品コードは区別しない
- システム識別子は区別する
このような場合、モジュール全体へOption Compare Textを適用すると、区別すべき文字列まで同じと判定される可能性があります。
比較箇所が限定されているなら、LCase・UCaseまたはStrCompを使い、比較条件をその場で明示する方が安全です。
特に複数人で管理するコードでは、「どこで大文字・小文字を無視しているか」が見える書き方を優先しましょう。
モジュール全体の文字列比較ルールを変更したい場合は、Option Compare BinaryとTextの違いや設定方法も確認しておきましょう。⇒【VBA】Option Compareステートメントの使い方|Binary・Textの違いと設定方法
✅ LCase・UCaseを検索や重複チェックへ活用する
大文字・小文字を区別しない比較は、2つの固定文字列を比べるだけではありません。
実務では、シート内の検索、マスタ照合、重複チェックなどで使う場面が多くあります。
ここで注意したいのが、セルを1件ずつ無計画に比較すると、データ量が増えたときに処理が遅くなることです。
また、比較するたびに同じ変換を繰り返すと、コードの重複が増え、修正漏れも起きやすくなります。
検索条件を先に正規化し、比較ルールを統一することで、処理の流れが分かりやすくなります。
ここでは、シート内の商品コードを検索する例を紹介します。
・シート内の商品コードを区別せず検索する
次のコードは、A列の商品コードを上から確認し、大文字・小文字を区別せず一致する行を探します。
Sub FindProductCodeIgnoreCase()
Dim targetWorksheet As Worksheet
Dim searchProductCode As String
Dim normalizedSearchCode As String
Dim lastRow As Long
Dim currentRow As Long
Dim currentProductCode As String
Set targetWorksheet = ThisWorkbook.Worksheets("商品マスタ")
searchProductCode = "ab-100"
normalizedSearchCode = UCase$(Trim$(searchProductCode))
'A列の最終行を取得する
lastRow = targetWorksheet.Cells( _
targetWorksheet.Rows.Count, "A").End(xlUp).Row
For currentRow = 2 To lastRow
currentProductCode = CStr( _
targetWorksheet.Cells(currentRow, "A").Value)
'検索値とセル値を同じルールで正規化して比較する
If UCase$(Trim$(currentProductCode)) = normalizedSearchCode Then
MsgBox "商品コードが見つかりました。" & vbCrLf & _
"行番号:" & currentRow, vbInformation
Exit Sub
End If
Next currentRow
MsgBox "商品コードは見つかりませんでした。", vbExclamation
End Sub
・検索値をループの外で変換する理由
このコードでは、検索対象となるsearchProductCodeをループの外で一度だけ大文字へ変換しています。
ループ内で毎回同じ検索値をUCaseへ変換しても結果は変わりません。
If UCase$(currentProductCode) = UCase$(searchProductCode) Then
この書き方でも動作しますが、データ件数が多いと、同じ変換処理を何度も繰り返すことになります。
検索値を先に正規化しておけば、
- 無駄な処理を減らせる
- 比較ルールが明確になる
- 後から正規化条件を追加しやすい
というメリットがあります。
小さな差ではありますが、実務コードでは「繰り返す必要のない処理をループ外へ出す」という設計が保守性と処理効率の両方に役立ちます。
・件数が多い場合は配列やDictionaryも検討する
数十件程度であればセルを順番に確認しても大きな問題はありません。
しかし、数万件のデータを繰り返し検索する場合、セルへ毎回アクセスすると処理時間が長くなります。
その場合は、
- セル範囲を配列へ取り込む
- Dictionaryへ正規化したコードを登録する
- 検索用のキーをUCaseまたはLCaseで統一する
といった方法が有効です。
ただし、データ件数が少ない処理まで無理に複雑化すると、コードが読みにくくなります。
まずは分かりやすい方法で作り、実際に速度が問題になった段階で配列やDictionaryへ変更する方が、実務では保守しやすい設計になります。
完全一致ではなく、文字列の一部が含まれているかを大文字・小文字を考慮しながら検索したい場合は、InStr関数の使い方も参考にしてください。⇒【VBA】(セル内)特定の文字の最初の位置を検索(InStr関数の使用方法)
✅ VBAで大文字・小文字を区別しないときの注意点
LCase・UCaseを使えば簡単に比較できますが、それだけですべての入力揺れを解決できるわけではありません。
実務データには、前後の空白、全角・半角、改行、見えない制御文字などが含まれることがあります。
大文字・小文字だけを統一して一致しない場合、別の原因を見落としている可能性があります。
また、Nullやエラー値をそのまま文字列関数へ渡すと、実行時エラーにつながることがあります。
比較処理では、どのようなデータが入力されるかを想定し、必要な前処理を選ぶことが重要です。
ここでは、実務で特に注意したい点を整理します。
・Nullやエラー値をそのまま渡さない
LCaseやUCaseへNullを渡すと、結果もNullになり、代入先や比較方法によってはエラーの原因になります。
セルの値を扱う場合も、数式エラーが入っている可能性があります。
安全に処理するには、先に値を確認します。
If IsError(targetWorksheet.Cells(currentRow, "A").Value) Then
'数式エラーを含むセルは比較対象から除外する
Else
currentProductCode = CStr( _
targetWorksheet.Cells(currentRow, "A").Value)
End If
Nullが入り得るデータベースや外部データを扱う場合は、IsNullによる判定も必要です。
すべての値を無条件にCStrへ変換するのではなく、入力元に応じて例外を考慮しましょう。
セルのValueをそのまま文字列関数へ渡してよいか迷う場合は、型変換が必要になるケースも確認しておきましょう。⇒【VBA】Valueは文字列として扱える?型変換が必要なケースと実務判断を解説
・全角と半角はLCase・UCaseだけでは統一できない
LCase・UCaseが変換するのは、基本的にアルファベットの大文字・小文字です。
例えば、全角の「ABC」と半角の「ABC」は、UCaseを使っても同じ文字列にはなりません。
必要に応じて、StrConvを組み合わせます。
normalizedText = UCase$(StrConv(sourceText, vbNarrow))
ただし、StrConvの動作は実行環境や対象文字によって影響を受けることがあります。
また、すべての文字列を半角へ変換してよいとは限りません。
住所、会社名、氏名などでは元の表記を残す必要があるため、比較専用の値にだけ適用することが大切です。
・比較ルールを処理ごとに変えない
同じ商品コードを、ある処理ではUCase、別の処理ではそのまま比較すると、処理ごとに判定結果が変わる可能性があります。
そのため、実務では比較ルールを関数としてまとめる方法も有効です。
Private Function NormalizeProductCode( _
ByVal sourceCode As String) As String
'商品コード比較用に前後空白を除去し、大文字へ統一する
NormalizeProductCode = UCase$(Trim$(sourceCode))
End Function
利用側では次のように書けます。
If NormalizeProductCode(enteredProductCode) = _
NormalizeProductCode(masterProductCode) Then
MsgBox "一致しました。", vbInformation
End If
正規化処理を1か所へまとめておけば、後からハイフン削除などの仕様を追加するときも修正箇所を減らせます。
ただし、用途の異なる文字列まで1つの関数で処理すると混乱するため、商品コード、メールアドレス、社員IDなど、目的ごとに関数を分けるのがおすすめです。
✅ まとめ:VBAのLCase・UCaseで安全に文字列を比較しよう
LCase・UCaseを使うと、アルファベットの大文字・小文字を統一し、表記の違いを無視して文字列を比較できます。
今回のポイントは次のとおりです。
- LCaseは英字を小文字へ変換する
- UCaseは英字を大文字へ変換する
- 比較する両方の文字列へ同じ変換を行う
- 元データは変更せず、比較時だけ変換する方が安全
- コード値ではUCase、一般文字列ではLCaseなど、ルールを統一する
- StrCompのvbTextCompareでも区別せず比較できる
- Option Compare Textはモジュール全体へ影響するため慎重に使う
- 手入力値ではTrimによる前後空白の除去も検討する
- 検索値はループの外で正規化すると無駄な処理を減らせる
- 全角・半角やNull、数式エラーは別途対策が必要
- 比較ルールが複雑になる場合は正規化関数へまとめる
単純な比較であれば、LCaseまたはUCaseを使った書き方が分かりやすく、実務にも取り入れやすい方法です。
一方、比較方法を明示したい場合はStrComp、モジュール全体で統一したい場合はOption Compare Textが候補になります。
重要なのは、短く書くことではなく、どのルールで文字列を比較しているのかが後から見ても分かることです。入力データの特徴に合わせて前処理を整理し、検索漏れや重複判定の失敗を防げるコードへつなげましょう。