(Excel)VLOOKUP関数で大文字と小文字を区別する

 ExcelのVLOOKUP関数で、検索値の大文字と小文字を区別して検索する方法についてです。
 ただしあまり実用的とは言えないため、より簡単なXLOOKUP関数やINDEX/MATCH関数を使う方法をお勧めします。

  • VLOOKUP関数とHSTACK/EXACT関数を併用することで、大文字と小文字を区別して検索できます。

手順

 次の画像では、E3セルに入力された検索値「abc」を左側の表から検索して対応する商品名「ぶどう」を取得しています。
 普通にVLOOKUP関数を使うと「Abc」にマッチするものと判断され「さくらんぼ」を取得してしまいますが、他の関数を併用することで大文字と小文字を区別した検索を行っています。

 F3セル

=VLOOKUP(TRUE,HSTACK(EXACT(B3:B10,E3),C3:C10),2,FALSE)

 VLOOKUP関数の第2引数(表範囲)を「HSTACK(EXACT(B3:B10,E3),C3:C10)」としています。これにより2列の表(配列)を生成し、検索及び値取得の対象としています。



 この第2引数の部分だけ実行すると次のように2列の表が得られます。
 左側の列は「B3:B10の値をそれぞれE3セルの値と(EXACT関数で)厳密に比較して一致したらTRUE、しなかったらFALSEに変換した配列」で、右側の列は抽出対象であるC3:C10セルそのものです。この表に対し「TRUE」を検索すれば、大文字と小文字を区別した検索結果になることがわかります。

 


 次の画像は3つの値を検索して取得する例です。
 上記の式中の「EXACT(B3:B10,E3)」を「EXACT(B3:B10,E3:E5)」に変更してもうまくいかない(スピルしない)ので、絶対参照を使った式にしてF5セルまでフィルコピーしています。

 F3セル(下方にコピー)

=VLOOKUP(TRUE,HSTACK(EXACT(B$3:B$10,E3),C$3:C$10),2,FALSE)

 一応はお題の通りにVLOOKUPで大文字と小文字の区別ができているのですが、以下で紹介するXLOOKUP関数等を使う式の方が簡単に済むので実用的な意味は薄いです。
 ただしいずれの方法も比較にEXACT関数を使用するというアプローチをとっているため複数の検索値を検索する際にスピルを用いることができず、上記の画像と同様に絶対参照を用いて対応することとなります。

XLOOKUP関数で対応する

 VLOOKUP関数の後継であるXLOOKUP関数を用いる代替案です。
 画像内のデータはVLOOKUP関数の例と同様ですが、ここではXLOOKUP関数を用いて検索値「abc」を左側の表から検索し、対応する商品名「ぶどう」を取得しています。

 F3セル

=XLOOKUP(TRUE,EXACT(B3:B10,E3),C3:C10)

 XLOOKUP関数の第2引数(検索範囲)を「EXACT(B3:B10,E3)」としています。これによりB3:B10の値をそれぞれE3セルと厳密に比較した結果の配列を得ています。ここから「TRUE」を検索することで、商品コードが厳密に一致する行の商品名が取得できます。



 なお「EXACT(B3:B10,E3)」の部分だけ実行すると次のようになります。
 VLOOKUP関数の場合と異なり「検索範囲と抽出範囲の両方を含む表」を生成する必要がないというのがメリットで、そのことが上記の式とこの画像からもわかります。

INDEX/MATCH関数で対応する

 VLOOKUP関数と並んで表引きによく使用されるINDEX関数とMATCH関数を用いる代替案です。

 F3セル

=INDEX(C3:C10,MATCH(TRUE,EXACT(B3:B10,E3),0))

 ここでも「EXACT(B3:B10,E3)」により、B3:B10の値をそれぞれE3セルと厳密に比較した結果の配列を得ています(XLOOKUP関数の例の2番目の画像参照)。
 MATCH関数でこの配列からTRUEを検索して位置を取得し、INDEX関数の第2引数(行番号)とすることで対応する商品名を取得しています。