はじめに:「EXCEL」と「excel」、Excelは同じものだと思っています!
Excelでデータを検索するとき、VLOOKUPやMATCH関数は、私たちの強力な味方です。
でも、ちょっと待ってください!
もし、あなたのリストに「EXCEL」と「excel」と「Excel」が混在していたら…?
Excelの検索関数は、初期設定では「大文字と小文字を区別しない」という、親切(おせっかい?)な仕様になっています。
そのため、"excel"を探しているのに、最初に見つかった"EXCEL"の値を返してしまう…という悲劇が起こるのです!
「え、じゃあどうやって、パスワードみたいに『厳密に』一致する値だけを探せばいいの?」
今回の記事は、まさにそのお悩みにお応えします!
前回、大文字小文字を区別して比較する7つの方法を紹介しました。
「厳密一致で値検索」をテーマに、初心者が陥りがちな「失敗例」と、その壁を打ち破る「正解例」をセットで探求していく、超実践的な関数パズルです。
この冒険が終わる頃には、あなたの検索スキルが、間違いなく爆上がりしていることでしょう!
本記事では、無料のWeb版Excelを使用して検証および画像の作成を行っています。Windowsはもちろん、MacやLinuxの方もブラウザさえあれば挑戦できます!
ステップ1:冒険の準備 – 巧妙な罠が仕掛けられたリスト
何事も、まずは準備から。まっさらなシートのA1セルを起点に、以下の6行2列のリストを作成してください。
以下の数式をA1セルに貼り付けてください。
={"名前","数値";"EXCEL",100;"01_excel",200;"excel",300;"Excel",400;"excel97",500}

このリストには、私たちの検索を阻む、数々の罠が仕掛けられています。
【今回のゴール】
検索値は「excel」(すべて小文字)。
A列から「excel」と“厳密に”一致する行を探し出し、B列の正しい値「300」を導き出すこと!
【前提条件】
今回のリスト(A2:A6)には、検索対象の文字列(”EXCEL”, “01_excel”など)に重複はないものとして話を進めますね!
7つのアプローチで、「厳密一致」の壁を突破せよ!
さあ、検索の旅に出ましょう。まずは、多くの人が試して、そして罠にはまる「失敗例」からご覧ください。
アプローチ1:検索の現在の定番 XLOOKUP
失敗例:XLOOKUPの「厳密一致」オプションの罠
=XLOOKUP("excel",A2:A6,B2:B6,,3)
「お、XLOOKUPには第5引数に[一致モード]があるぞ!『3 – 厳密一致』を使えば完璧だ!」
と思いきや、この数式が返すのは「200」です。
なぜでしょう?
実は、XLOOKUPのオプション「3」は、「大文字と小文字を区別する、ワイルドカードを含む検索」なのです!
つまり、”excel”という文字列が含まれていればヒットしてしまいます。
表の上から検索し、最初に見つかる「01_excel」がヒットしてしまい、「200」が返るのです。
これは紛らわしい!

正解例:XLOOKUP + EXACT
ではどうするか?答えは、厳密比較の専門家、EXACT関数を組み合わせることです。
=XLOOKUP(TRUE,EXACT(A2:A6,"excel"),B2:B6)
1. EXACT(A2:A6,"excel"): まず、EXACT関数が、A2:A6の各セルと"excel"を厳密に比較します。
結果は {FALSE;FALSE;TRUE;FALSE;FALSE} というTRUE/FALSEの配列になります。

2. XLOOKUP(TRUE, ..., B2:B6): 次に、XLOOKUP関数(デフォルトは完全一致)で、このTRUE/FALSE配列から「TRUE」を探します。
3番目に見つかるので、対応するB列(B2:B6)の3番目、「300」が正しく返されます!

メリット: 非常に直感的で、XLOOKUPの高速検索の恩恵も受けられます。
デメリット: 比較的新しいExcel(Microsoft 365、Excel 2021以降)でしか使えません。
アプローチ2:検索の古典派 LOOKUP
失敗例1:演算子「=」の罠
=LOOKUP(2,1/(A2:A6="excel"),B2:B6)
「1を論理値で割る」という、古くから伝わる「最後の行」検索テクニックです。
しかし、A2:A6="excel"の比較演算子「=」は、大文字と小文字を区別しません!

そのため、{"EXCEL";"excel";"Excel"}がヒットしてしまいます。
LOOKUPは「最後に見つかったもの」を返す性質があるため、リストの最後にある「Excel」の行、つまり「400」が返ってきます。

失敗例2:FIND関数の罠
=LOOKUP(2,1/ISNUMBER(FIND("excel",A2:A6)),B2:B6)
「そうだ、FIND関数なら大文字と小文字を区別するぞ!」と、これを使ってもまだ罠があります。
FIND関数は「部分一致」でも見つけてしまうのです!

{"01_excel";"excel";"excel97"}の3つがヒットし、LOOKUPは最後に見つかった「excel97」の行、つまり「500」を返してしまいます。

正解例:LOOKUP + EXACT
やはり、ここでも救世主はEXACT関数です。
=LOOKUP(2,1/EXACT(A2:A6,"excel"),B2:B6)
1. EXACT(A2:A6,"excel"): {FALSE;FALSE;TRUE;FALSE;FALSE} という厳密なTRUE/FALSE配列を作ります。
2. 1/...: 1をこの配列で割ることで、{#DIV/0!;#DIV/0!;1;#DIV/0!;#DIV/0!} という、エラーと「1」が混在した配列を作ります。

3. LOOKUP(2, ..., B2:B6): LOOKUP関数で、この配列から「2」を探します。
LOOKUPは、検索値(2)以上の値がない場合、エラーを無視して配列の中の最後の数値(今回は「1」)を見つけてくれます!
そして、その位置(3番目)に対応するB列の値、「300」を返します。

メリット: 非常に古いExcelでも動作する、互換性の高いテクニックです。
デメリット: 1/0やLOOKUP(2,...)といったロジックは、知らない人には解読不能です。
アプローチ3:実務の定番 INDEX & MATCH
失敗例1:MATCH関数の罠
=INDEX(B2:B6,MATCH("excel",A2:A6,0))
ご存知、最強コンビのINDEX & MATCH。
しかし、MATCH関数(第3引数[0]=完全一致)も、VLOOKUPや「=」演算子と同じく、大文字と小文字を区別しません。
そのため、リストの最初に見つかる「EXCEL」にヒットし、1番目の値「100」が返されます。

失敗例2:XMATCH関数の罠
=INDEX(B2:B6,XMATCH("excel",A2:A6,3))
「ならば、XMATCHの厳密一致オプション『3』だ!」
残念!アプローチ1で見たように、これは「部分一致」も拾ってしまいます。
最初に見つかる「01_excel」にヒットし、2番目の値「200」が返されます。

正解例:INDEX + MATCH + EXACT
ここでも、EXACT関数との組み合わせが光ります。
=INDEX(B2:B6,MATCH(TRUE,EXACT(A2:A6,"excel"),0))
1. EXACT(A2:A6,"excel"): {FALSE;FALSE;TRUE;FALSE;FALSE} の配列を作ります。
2. MATCH(TRUE, ..., 0): この配列から、「TRUE」という値を「完全一致(0)」で探します。3番目に見つかるので、「3」という位置を返します。

3. INDEX(B2:B6, 3): INDEX関数が、B列の3番目の値、「300」を返します。

メリット: 非常に汎用性が高く、多くのExcelバージョンで使える、実務的な「正解」の一つです。
デメリット: 数式が少し長くなりますが、ロジックは明確です。
アプローチ4:みんな大好き VLOOKUP
失敗例:VLOOKUP(…, FALSE)の罠
=VLOOKUP("excel",A2:B6,2,FALSE)
もう、説明不要かもしれませんね。
VLOOKUPの「FALSE(完全一致)」も、大文字と小文字を区別しません。
最初に見つかる「EXCEL」にヒットし、「100」が返されます。

正解例:VLOOKUP + CHOOSE + EXACT
「それでも、私はVLOOKUPを使いたいんだ!」というあなたへ。
意地でも使う方法があります。
=VLOOKUP(TRUE,CHOOSE({1,2},EXACT(A2:A6,"excel"),B2:B6),2,FALSE)
1. EXACT(A2:A6,"excel"): {FALSE;FALSE;TRUE;FALSE;FALSE} の配列を作ります。
2. CHOOSE({1,2}, ..., B2:B6): CHOOSE関数を使い、メモリ上に新しい2列の仮想テーブルを作ります。
1列目にはEXACTの結果、2列目にはB列の数値リストを配置します。

3. VLOOKUP(TRUE, ..., 2, FALSE): VLOOKUPで、この仮想テーブルの1列目から「TRUE」を完全一致で探し、2列目の値「300」を返します。

メリット: 意地でもVLOOKUPが使えます。
デメリット: 本来のVLOOKUPの使い方から大きく逸脱しており、非常に難解です。
アプローチ5:FILTER (最新・最シンプル)
考えかた
比較的新しいExcel(Microsoft 365、Excel 2021以降)を使っているなら、もう悩む必要はありません。
FILTER関数が、この問題を簡単に解決します。
正解例
=FILTER(B2:B6,EXACT(A2:A6,"excel"))
「B2:B6の範囲を、EXACT(A2:A6,"excel")がTRUEである行だけ、絞り込んでください」
これ以上ないほど、やっていることが明確な数式です。結果はもちろん「300」です。

メリット: 最もシンプルで、可読性が抜群に高いです。
デメリット: 比較的新しいExcel(Microsoft 365、Excel 2021以降)でしか使えません。
アプローチ6:SUM + EXACT (配列計算)
考えかた
もし、返したい値が「数値」であり、かつ検索値に「重複がない」ことが保証されているなら、SUM関数を使った配列計算も有効です。
重複を考慮する場合、「合計 / 個数」を計算する必要があります。
今回は、重複がない前提で話を進めるので、この計算は省略しますね!
正解例
=SUM(EXACT(A2:A6,"excel")*B2:B6)
1. EXACT(A2:A6,"excel"): {FALSE;FALSE;TRUE;FALSE;FALSE} の配列を作ります。
2. ... * B2:B6: このTRUE/FALSE(1/0)の配列と、B列の数値配列を掛け合わせます。{0*100; 0*200; 1*300; 0*400; 0*500} → {0;0;300;0;0}

3. SUM(...): 最後に、この配列をSUM関数で合計します。結果は「300」です。

メリット: 比較的古いExcelでも(CSE確定すれば)動作し、ロジックも分かりやすいです。
デメリット: 厳密に一致するものが2つあると、それらの合計が返ってしまうため、重複がない前提が必要です。あるいは、重複処理が必要です。
アプローチ7:EXACT関数禁止! (究極の関数パズル)
考えかた
「結局、EXACT関数がないとダメじゃないか!」
そんな声が聞こえてきそうです。
分かりました。
最後は、EXACT関数すら使わずに、文字コードレベルで比較する究極の数式です。
正解例
=LET(a,MAX(LEN(A2:A6)),b,SEQUENCE(,a),c,IFERROR(UNICODE(MID(A2:A6,b,1)),0),d,IFERROR(UNICODE(MID("excel",b,1)),0),SUM((MMULT((c=d)*1,SEQUENCE(a)^0)=a)*(B2:B6)))
1. a: リスト内の最大文字長を取得します。(例: 8)

2. b: 1から9までの連番 {1,2,...,8} を作ります。

3. c: A2:A6の各セルを1文字ずつ分解し、文字コードに変換した2次元配列を作ります。(5行8列)

4. d: 検索値”excel”を文字コードに変換した配列を作ります。(1行8列)

5. (c=d)*1: cとdを比較し、文字コードが一致する場所だけが1になる5×8の配列を作ります。

6. MMULT(..., SEQUENCE(a)^0)=a: 各行の「一致した文字数」を合計し、MAX(LEN(A2:A6))で求めた「8」と等しいか比較します。

7. SUM(... * (B2:B6)): この判定がTRUEになった行(A4セルのみ)のB列の値「300」を抜き出して合計します。

メリット: 最高の達成感が得られます。
デメリット: 実務で使ったら、未来の自分(または同僚)が泣きます。
まとめ:Excelの「常識」を疑え!
普段、当たり前に使っている「=」や「VLOOKUP(…,FALSE)」が、実は大文字と小文字を区別していない、という事実に驚かれたのではないでしょうか。
この「Excelの常識」を知っているかどうかで、データの正確性が大きく変わってきます。
実務で厳密な比較が必要になったら、必ず「EXACT」関数を思い出してください。
比較的新しいExcelをお持ちなら、アプローチ5のFILTER関数が、最もシンプルで可読性が高く、最強の解決策となるでしょう。
今回の関数パズルが、皆さんの「検索スキル」を爆上げするきっかけになれば、これほど嬉しいことはありません。



