Excelで大文字・小文字を区別して検索する方法【EXACT×INDEX/MATCHの実践レシピ】
製品コードの大文字・小文字を間違えて、VLOOKUPが全く見当違いの商品名を返してきた──そんな経験はないでしょうか。
SKU-a001とSKU-A001が同じシートに混在しているのに、VLOOKUPはどちらも「同じコード」として扱ってしまう。このExcelの仕様は、データ管理の現場では意外と深刻なバグの温床になります。
この記事を読み終えると、EXACT関数とINDEX/MATCHを組み合わせた配列数式を使って、大文字・小文字を完全に区別した検索を自分で組めるようになります。Microsoft 365ユーザー向けのXLOOKUP版も紹介するので、環境に合わせて使い分けてください。
なぜVLOOKUPやMATCHは大文字・小文字を区別しないのか
ExcelのMATCH・VLOOKUP・XLOOKUPは、内部的に文字列を大文字に統一してから比較します。これはExcelが「ユーザーフレンドリー」を優先した設計の結果ですが、裏を返せばケースセンシティブな検索には使えないということでもあります。
| 関数 | "abc" と "ABC" の扱い |
ケースセンシティブ対応 |
|---|---|---|
| VLOOKUP | 同一視する | ❌ |
| MATCH | 同一視する | ❌ |
| XLOOKUP | 同一視する | ❌(単体では) |
たとえば以下のようなシートがあるとします。
| A列(コード) | B列(商品名) |
|---|---|
| SKU-a001 | 小型ファン(個人向け) |
| SKU-A001 | 大型ファン(業務用) |
| SKU-b002 | モバイルバッテリー |
| SKU-B002 | 据置バッテリー |
このデータは、同じ品番でも個人向けと業務用を小文字・大文字で管理しているケースです。海外仕入れのシステムと国内管理システムが別々にコードを振った結果、こうした混在が起きることは実務でも珍しくありません。
通常のMATCHで"SKU-A001"を検索すると、大文字・小文字を区別しないため最初に見つかったSKU-a001の行を返してしまいます。結果、業務用ファンを注文したつもりが個人向けの明細が出てくる、というミスが生まれます。
解決策:EXACT関数で「厳密な一致」を作る
EXACT関数は、2つの文字列を大文字・小文字・スペースを含めて完全一致で比較し、TRUEまたはFALSEを返します。
=EXACT("abc", "ABC") → FALSE
=EXACT("abc", "abc") → TRUE
ただし、EXACT単体では1対1の比較しかできません。リスト全体に対して一括で比較するには、範囲全体を渡して配列として処理させる必要があります。ここでINDEX/MATCHの出番です。
実践:INDEX + MATCH + EXACTの組み立て方
基本の数式
先ほどのサンプルデータ(A2:B5)を使って、SKU-A001に対応する商品名を取得します。
=INDEX(B2:B5, MATCH(TRUE, EXACT(A2:A5, "SKU-A001"), 0))
結果: 大型ファン(業務用)
Excel 2019以前の入力方法
Ctrl + Shift + Enter で配列数式として確定してください。数式バーに自動で{ }が付きます。
{=INDEX(B2:B5, MATCH(TRUE, EXACT(A2:A5, "SKU-A001"), 0))}
Microsoft 365 / Excel 2021では、通常のEnterだけで配列として処理されます。
数式の動作を1ステップずつ理解する
| 部分 | 動作 | 結果の例 |
|---|---|---|
EXACT(A2:A5, "SKU-A001") |
各セルと検索値を厳密比較 | {FALSE; TRUE; FALSE; FALSE} |
MATCH(TRUE, ..., 0) |
TRUEの位置(行番号)を取得 |
2 |
INDEX(B2:B5, 2) |
2行目の値を返す | "大型ファン(業務用)" |
EXACTがリスト全体に対してTRUE/FALSEの配列を生成し、MATCHがその中のTRUEの位置を探す──この連携が、ケースセンシティブ検索の核心です。
検索値をセル参照にする
検索値を数式に直書きするのではなく、セル参照(例:E2)にしておくと実用的です。
=INDEX(B2:B5, MATCH(TRUE, EXACT(A2:A5, E2), 0))
E2に検索したいコードを入力するだけで結果が切り替わります。
Microsoft 365限定:XLOOKUP版でさらに読みやすく
⚠️ このセクションはMicrosoft 365およびExcel 2021以降が対象です。Excel 2019以前では使用できません。
XLOOKUPもデフォルトでは大文字・小文字を区別しませんが、EXACTと組み合わせることで対応できます。
=XLOOKUP(TRUE, EXACT(A2:A5, E2), B2:B5, "該当なし")
XLOOKUPを使う利点
- 第4引数でエラー時の表示を指定できる。
"該当なし"を設定しておけば#N/Aが表示されない Ctrl + Shift + Enterが不要で入力が楽- 数式の構造がINDEX/MATCHより直感的
よくあるミスと対処法
①#N/Aエラーが出る
検索値のスペルや大文字・小文字を確認してください。EXACTはスペース1文字の違いでもFALSEを返します。先頭・末尾のスペースが原因の場合はTRIMで除去してから検索してください。
=INDEX(B2:B5, MATCH(TRUE, EXACT(A2:A5, TRIM(E2)), 0))
② 配列数式として動作しない
Excel 2019以前で{ }が付いていない場合、MATCHに配列が渡されず正しく動きません。数式を選択した状態でCtrl + Shift + Enterを押し直してください。
③ 複数の一致がある場合
MATCHは最初にTRUEになった行だけを返します。複数件を取得したい場合はFILTER + EXACT(Microsoft 365)を使います。これは次回の記事で詳しく解説します。
まとめ:環境別の使い分け早見表
| 状況 | 推奨する方法 |
|---|---|
| Excel 2016〜2019 | INDEX + MATCH + EXACT(Ctrl+Shift+Enter) |
| Microsoft 365 / 2021 | INDEX + MATCH + EXACT(通常Enter) |
| エラー処理もしたい | XLOOKUP + EXACT(Microsoft 365) |
| 複数件取得したい | FILTER + EXACT(Microsoft 365) |
大文字・小文字の区別は、最初は回りくどく感じるかもしれません。ただ、「EXACTでTRUE/FALSEの配列を作り、MATCHでTRUEの位置を拾う」という仕組みを一度理解すると、応用の幅が大きく広がります。まずは手元のデータでそのまま試してみてください。
次回予告: FILTER + EXACTを使って、大文字・小文字を区別した複数件の一括抽出に挑戦します。1件だけでなく条件に合う全行を取り出したい場面に役立つテクニックです。お楽しみに!