「大文字・小文字の違いで、データが狂う」その悩みを解決します
倉庫管理システムから書き出したCSVを突合しようとしたとき、Item-A(正規品)と item-a(試作品)が同一視されて在庫数が狂ってしまった——そんな経験はありませんか?
USD(米ドル)とusd(テスト用ダミーデータ)を区別して集計したいPRD-001(正規品)とprd-001(試作品)を別々に管理したい
通常のVLOOKUPやXLOOKUPは、大文字・小文字を区別しない(case insensitive)仕様で動作します。そのため、どちらを検索しても最初にヒットした行が返ってきてしまいます。
でも、安心してください。EXACTという関数を組み合わせるだけで、このすべての問題は解決できます。
この記事では、EXACT関数の基本からINDEX・MATCH、XLOOKUPとの実践的な組み合わせまで、コピペしてすぐ使えるサンプル付きで解説します。
なぜVLOOKUPは大文字・小文字を区別しないのか
Excelの比較演算子(=)は、文字列を比較するときに大文字・小文字を区別しない仕様になっています。"ABC" = "abc" は TRUE を返します。VLOOKUPやMATCHは、この比較演算子の仕組みに依存して動作するため、大文字・小文字が違っても「同じ文字列」と判断してしまうのです。
つまり、関数のバグではなく設計上の仕様です。そのため、大文字・小文字を厳密に区別したい場合は、別の手段——EXACT関数——を使う必要があります。
EXACT関数:大文字・小文字を区別する唯一の比較関数
=EXACT(文字列1, 文字列2)
EXACT関数は、2つの文字列が大文字・小文字を含めて完全に一致するかを判定します。
| 文字列1 | 文字列2 | 結果 |
|---|---|---|
ABC |
abc |
FALSE |
ABC |
ABC |
TRUE |
Apple |
apple |
FALSE |
usd |
usd |
TRUE |
シンプルな2値の比較ならEXACT単体で使えますが、リストの中から条件に合う行を探し出すには、INDEX・MATCHやXLOOKUPと組み合わせる必要があります。EXACTはあくまで「同じかどうか」を判定するだけで、「どこにあるか」を探す機能は持っていないからです。そこで次に紹介する組み合わせ技が活躍します。
INDEX・MATCH・EXACTで大文字・小文字を区別した検索
基本構成
=INDEX(返す範囲, MATCH(TRUE, EXACT(検索範囲, 検索値), 0))
EXACT(検索範囲, 検索値) は {FALSE; TRUE; FALSE} のような配列を返します。MATCHはその中から TRUE の位置を探し、INDEXが対応する値を返す——という仕組みです。
具体例
以下のデータで「usd」を検索し、対応する名称を取得します。
| A列(コード) | B列(名称) |
|---|---|
USD |
米ドル |
usd |
テストデータ |
EUR |
ユーロ |
=INDEX(B2:B4, MATCH(TRUE, EXACT(A2:A4, "usd"), 0))
→ 結果:テストデータ
通常のVLOOKUPでは USD(1行目)がヒットしますが、この数式では usd(2行目)を正しく識別します。
バージョン別の注意点
| Excelバージョン | 入力方法 |
|---|---|
| 2019以前 | Ctrl + Shift + Enter(配列数式) |
| 365 / 2021 | 通常のEnterでOK |
XLOOKUPとEXACTの組み合わせ(Excel 365推奨)
Excel 365以降を使っている場合は、XLOOKUPを使うとより簡潔に書けます。
基本構成
=XLOOKUP(TRUE, EXACT(検索範囲, 検索値), 返す範囲, 見つからない場合の値)
具体例
=XLOOKUP(TRUE, EXACT(A2:A4, "usd"), B2:B4, "該当なし")
→ usd が見つかれば テストデータ、見つからなければ 該当なし
第4引数でエラー時のメッセージを設定できるのはXLOOKUPの大きな強みです。IFERRORを別途ネストする必要がなく、数式がすっきりします。
INDEX・MATCHとの使い分け
| 組み合わせ | 特徴 | 向いているケース |
|---|---|---|
INDEX + MATCH + EXACT |
旧バージョン対応・安定性が高い | 2019以前の環境・共有ファイル |
XLOOKUP + EXACT |
記述がシンプル・エラー処理が楽 | 365環境の個人・チーム利用 |
実践ユースケース:そのままコピペして使える数式サンプル
① 商品管理コードの区別
正規品 PRD-001 と試作品 prd-001 が混在するリストから、試作品だけを抽出したい。
| A列(コード) | B列(ステータス) |
|---|---|
PRD-001 |
正規品 |
prd-001 |
試作品 |
PRD-002 |
正規品 |
=XLOOKUP(TRUE, EXACT(A2:A4, "prd-001"), B2:B4, "該当なし")
→ 結果:試作品(大文字の PRD-001 は無視される)
② ユーザー認証のシミュレーション
入力されたIDを登録済みリストと厳密に照合し、一致すれば「認証OK」を返す簡易チェック。
| A列(登録ID) | B列(権限) |
|---|---|
Admin |
管理者 |
admin |
一般ユーザー |
ADMIN |
システム用 |
=XLOOKUP(TRUE, EXACT(A2:A4, D2), B2:B4, "未登録")
※ D2 に入力されたIDを検索。Admin / admin / ADMIN をそれぞれ正確に区別します。
③ 外部データとの突合(CSVや基幹システム連携)
APIや基幹システムから取得したCSVには、大文字・小文字が混在していることがあります。たとえば EUR(正規)と eur(旧データ)が混在するケースで、正規データだけを参照したい場合:
| A列(通貨コード) | B列(レート) |
|---|---|
EUR |
1.08 |
eur |
旧レート |
GBP |
1.27 |
=INDEX(B2:B4, MATCH(TRUE, EXACT(A2:A4, "EUR"), 0))
→ 結果:1.08(小文字の eur は無視して正規レートを取得)
まとめ:EXACTを軸にバージョンで使い分ける
大文字・小文字の区別が必要な場面では、EXACT関数を軸に据えて、環境や用途に合わせた関数と組み合わせるのがベストです。
- Excel 2019以前:
=INDEX(返す範囲, MATCH(TRUE, EXACT(検索範囲, 検索値), 0))をCtrl+Shift+Enterで入力 - Excel 365 / 2021:
=XLOOKUP(TRUE, EXACT(検索範囲, 検索値), 返す範囲, "該当なし")をそのまま入力
普段何気なく使っているVLOOKUPも、EXACTとの組み合わせ次第でより精度の高いデータ処理が実現できます。商品コード管理や外部データ突合など、ぜひ実務に取り入れてみてください。
この記事は「Lookupシリーズ」の一部です。他の記事もあわせてご覧ください。