はじめに:「A」と「a」は、同じですか?
Excelを使っている皆さん、突然ですがクイズです。
セルA1に「A」(大文字)、セルB1に「a」(小文字)が入っているとき、C1セルに=A1=B1と入力したら、結果は何になると思いますか?
「もちろんFALSE(違う)でしょ!」
そう思いますよね?
ブブーッ!
正解は、なんと「TRUE」です。

「ええーっ!?なんで!? Aとaは明らかに違う文字だろ!」
そう、ここにExcelの「常識」の罠があります。
Excelの「=」(イコール)演算子は、なんとデフォルトで大文字と小文字を区別しないように作られているのです。
これは、VLOOKUP関数などで「Apple」も「apple」も同じ商品として見つけられるように、というExcelなりの優しさ(おそらく、おせっかい!)なのです。
でも、もし「A」と「a」を、パスワードのように厳密に区別して比較したいとしたら…?
今回の記事は、このExcelの「優しさ」の裏をかき、「大文字と小文字を厳密に区別して比較する」ための、7種類もの異なるアプローチを探求する、知的な関数パズルです!
【今回のルール】
1. 比較するのは1文字対1文字のシンプルなケースとします。
2. 空白セルはない前提で、ロジックの理解を最優先します!
準備:挑戦者となるリスト
本記事では、無料のWeb版Excelを使用して検証および画像の作成を行っています。Windowsはもちろん、MacやLinuxの方もブラウザさえあれば挑戦できます!
何事も、まずは準備から。まっさらなシートのA1セルを起点に、以下の3行2列のリストを作成してください。
={"A","a";"a","a";"A","A"}

ゴールは、任意のセルに数式を入力(フィルコピー)し、A列とB列を厳密に比較した結果、つまり{FALSE;TRUE;TRUE}という配列を正しく表示させることです。
7つのアプローチで、「厳密な判定」を攻略せよ!
数式を入力し、フィルコピーする方法で解説します。
アプローチ1:EXACT – 厳密比較のために生まれた関数
考えかた
まずは、この問題のためだけに生まれてきたような、王道の関数から参りましょう。その名も「EXACT(厳密な)」関数です。
数式と解説
=EXACT(A1,B1)
・EXACT(文字列1, 文字列2): 2つの文字列が、大文字と小文字を含めて、完全に(厳密に)一致しているかどうかを判定します。
・C1: =EXACT("A","a") → FALSE
・C2: =EXACT("a","a") → TRUE
・C3: =EXACT("A","A") → TRUE
これ以上ないほどシンプルで、やっていることが一目瞭然ですね。実務では、まずこの関数を思い浮かべましょう。

アプローチ2:UNICODE – 文字コードで比較する
考えかた
アプローチ1の「なぜ?」に迫る方法です。EXACT関数は、内部的にはきっとこんなことをやっているはずです。
コンピュータの世界では、すべての文字に「文字コード」という固有の番号が割り当てられています。
「A」と「a」は、人間には似て見えますが、コンピュータにとっては全くの別物。
その証拠を、UNICODE関数で暴き出しましょう。
数式と解説
=UNICODE(A1)=UNICODE(B1)
・UNICODE(文字列): 指定した文字の、先頭1文字の文字コード(数値)を返します。
・C1: UNICODE("A")は「65」、UNICODE("a")は「97」を返します。65 = 97 は、もちろん FALSE です。
・C2: UNICODE("a") → 97。UNICODE("a") → 97。97 = 97 は TRUE です。
・C3: UNICODE("A") → 65。UNICODE("A") → 65。65 = 65 は TRUE です。
EXACT関数の中身が透けて見えるような、非常に美しいロジックですね。

似たような漢字(例:「杮」と「柿」)を厳密に比較したい場合も、文字コードで比較するのが最も確実です。

アプローチ3:FIND -「見つかるか」で判定する
考えかた
Excelの文字列検索関数には、大文字小文字を「区別する」FIND関数と、「区別しない」SEARCH関数があります。
この「区別する」性質を利用します。「もし同じ文字なら、見つかるはずだ!」というロジックです。
数式と解説
=ISNUMBER(FIND(A1,B1))
・FIND(検索文字列, 対象文字列): 対象文字列の中から、検索文字列を「大文字と小文字を区別して」探し、その位置(数値)を返します。見つからなければ #VALUE! エラーを返します。
- C1:
FIND("A","a")→ “a”の中に”A”はないので、#VALUE!エラー。 - C2:
FIND("a","a")→ “a”の中に”a”は1文字目にあるので、「1」という数値を返します。 - C3:
FIND("A","A")→ “A”の中に”A”は1文字目にあるので、「1」という数値を返します。

・ISNUMBER(…): ISNUMBER関数が、この結果を判定します。数値(1)の場合は TRUE、エラー(#VALUE!)の場合は FALSE となり、見事に厳密比較が完成します。

アプローチ4:SUBSTITUTE -「置換できるか」で判定する
考えかた
文字列の置換を行うSUBSTITUTE関数も、FIND関数と同様に「大文字と小文字を厳密に区別」します。
この性質を利用します。「もしA1とB1が厳密に同じ文字なら、A1の文字列を、B1から探して”+”に置換したら、結果は”+”になるはずだ!」というロジックです。
数式と解説
=SUBSTITUTE(A1,B1,"+")="+"
・SUBSTITUTE(文字列, 検索文字列, 置換文字列): 文字列の中から、検索文字列を「大文字と小文字を区別して」探し、置換文字列に置き換えます。
・C1: SUBSTITUTE("A","a","+") → “A”の中に”a”はないので、置換は行われず、結果は “A” のまま。"A" = "+" は FALSE。
・C2: SUBSTITUTE("a","a","+") → “a”が”a”に見つかるので、結果は “+” に置換されます。"+" = "+" は TRUE。
・C3: SUBSTITUTE("A","A","+") → “A”が”A”に見つかるので、結果は “+” に置換されます。"+" = "+" は TRUE。

これもまた、関数の性質を巧みに利用した、美しい解法ですね。
アプローチ5:XMATCH – オプション「3」の隠された力
考えかた
ここからが本番です。検索関数でこの厳密比較を行うにはどうすればよいでしょう?
残念ながら、MATCH関数自体には大文字小文字を区別するオプションがありません。
しかし、その後継であるXMATCH関数には、このための秘密のオプションが用意されているのです!
数式と解説
=IFNA(XMATCH(A1,B1,3,1),0)=1
この数式、少し複雑に見えますが、やっていることはXMATCHのオプション活用です。
1. XMATCH(A1, B1, 3, 1): ここが心臓部です!
XMATCH(検索値, 検索範囲, [一致モード], [検索モード])
のように使います。
・検索値「A1」を、検索範囲「B1」から探します。
・第3引数(一致モード)に「3」を指定!これが「厳密一致(大文字と小文字を区別)」を意味する、オプションです。(デフォルトは0=完全一致、-1=近似一致など)
・第4引数(検索モード)は「1」(先頭から検索)を指定します。
・C1: XMATCH("A", "a", 3, 1) → 厳密に一致しないので、#N/A エラー。
・C2: XMATCH("a", "a", 3, 1) → 厳密に一致!1番目に見つかるので、「1」。
・C3: XMATCH("A", "A", 3, 1) → 厳密に一致!1番目に見つかるので、「1」。

2. IFNA(…, 0): 見つからなかった場合の #N/A エラーを、IFNA関数で「0」に変換します。結果は {0;1;1} となります。
3. ... = 1: 最後に、この結果が「1」(=見つかった)と等しいかどうかを判定し、{FALSE;TRUE;TRUE} を得ます。

従来のMATCH関数ではできなかったことが、XMATCHならオプション一つで実現できるとは、驚きですね!
アプローチ6:XLOOKUP – IF関数のような振る舞い
考えかた
XMATCHに厳密一致オプションがあるなら、もちろん、その親玉であるXLOOKUP関数にも搭載されています!
このオプションを利用し、XLOOKUPをまるでIF関数のよう(TRUE/FALSEを返すよう)に使ってみましょう。
数式と解説
=XLOOKUP(A1,B1,TRUE,FALSE,3)
この数式、引数の指定が非常に特殊で、まるでパズルのようです。
・XLOOKUP(検索値, 検索範囲, 戻り配列, [見つからない場合], [一致モード]) の引数を見ていきましょう。
・検索値: A1 (例: “A”)
・検索範囲: B1 (例: “a”)
・戻り配列: TRUE (もし見つかったら、このTRUEという値を返してね)
・[見つからない場合]: FALSE (もし見つからなかったら、このFALSEという値を返してね)
・[一致モード]: 3 (XMATCHと同じく「厳密一致(大文字と小文字を区別)」!)
・C1セル (“A”, “a”) の場合:
・”A”を”a”から「厳密一致(3)」で探します → 見つかりません。
・したがって、[見つからない場合] の引数である FALSE が返されます。
・C2セル (“a”, “a”) の場合:
・”a”を”a”から「厳密一致(3)」で探します → 見つかります!
・したがって、[戻り配列] の引数である TRUE が返されます。
・C3セル (“A”, “A”) の場合:
・”A”を”A”から「厳密一致(3)」で探します → 見つかります!
・したがって、[戻り配列] の引数である TRUE が返されます。

XLOOKUPのオプションをフル活用した、非常にエレガントな厳密判定ですね!
アプローチ7:TEXTSPLIT + COLUMNS – 分割数で判定する!?
考えかた
最後は、発想が飛び抜けた関数パズルです。
TEXTSPLIT関数が「区切り文字」の大文字と小文字を厳密に区別する、という性質を利用します。「”A”と”a”を連結した”Aa”」という文字列を、「”A”」で分割すると、どうなるでしょう?
数式と解説
=COLUMNS(TEXTSPLIT(CONCAT(A1,B1),A1))=3
この数式、一体何が起こっているのでしょうか?
①C1セル (“A”, “a”) の場合:
CONCAT(A1,B1)→ “Aa” という文字列ができます。TEXTSPLIT("Aa", A1)→TEXTSPLIT("Aa", "A")となります。TEXTSPLITは”A”を区切り文字として、”Aa”を分割します。- 結果は、「”A”の手前の空白」と「”A”の後の”a”」の2つに分割され、
{"","a"}という配列ができます。 COLUMNS(...)→ この配列の列数「2」を返します。2 = 3は FALSE です。(正解!)
②C2セル (“a”, “a”) の場合:
CONCAT(A2,B2)→ “aa” という文字列ができます。TEXTSPLIT("aa", A2)→TEXTSPLIT("aa", "a")となります。- “a”で分割すると、「1文字目の”a”の手前の空白」「”a”と”a”の間の空白」「2文字目の”a”の後の空白」の3つに分割され、
{"","",""}という配列ができます。 COLUMNS(...)→ この配列の列数「3」を返します。3 = 3は TRUE です。(正解!)
③C3セル (“A”, “A”) の場合:
C2と全く同じロジックで TEXTSPLIT("AA", "A") となり、{"","",""} の3列に分割されます。3 = 3 は TRUE です。(正解!)

いやはや、TEXTSPLITの分割ロジックを逆手に取った、見事な数式パズルですね!
まとめ:厳密な比較は、EXACT関数がおすすめ!
たかが大文字と小文字、されど大文字と小文字。
Excelが普段いかに「気を利かせて」くれているか、そして、その「気遣い」を乗り越えるために、いかに多くの関数の性質が利用できるか、感じていただけたのではないでしょうか。
実務で使うなら、アプローチ1のEXACT関数が、誰にとっても分かりやすく、意図が明確なので最強です。また、アプローチ2のUNICODE関数は、なぜAとaが違うのかという「理由」を教えてくれる、本質的な方法です。
しかし、FINDやSUBSTITUTE、XLOOKUP、TEXTSPLITといった関数たちも、その「大文字と小文字を区別する(または、しない)」という隠れた性質を知ることで、あなたの「関数の引き出し」は確実に増えていきます。
今回の関数パズルが、皆さんのExcelへの知的好奇心をさらに深めるきっかけになれば、これほど嬉しいことはありません。

