doodle-on-web

自分で調べたことや、仕事の中で質問されたことなどをまとめています。

ExcelのVLOOKUPで「大文字・小文字の区別」ができない問題をコピペ数式で解決する方法

スポンサーリンク


「大文字・小文字の違いで、データが狂う」その悩みを解決します

倉庫管理システムから書き出した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シリーズ」の一部です。他の記事もあわせてご覧ください。