最近お仕事中にハマった問題からの投稿です。
前回と同じくちまちました話題で恐縮です。
Problem
Excelで VLOOKUP
や COUNTIF
、MAXIFS
など、「マッチする値を検索して◯◯する」系関数を利用する時、どういうわけか「現にそこに存在するのに検索にヒットしない、結果◯◯してもらえない」あるいは逆に「ヒットしないと思っていたものがヒットして、結果◯◯されてしまう」という問題がたまに起きます。
Solution
ワイルドカードと関数の特性を理解しましょう。
まず、ワイルドカードです。
Microsoftのサポートページにも案内がある通り、Excel内で検索をするときにはワイルドカード ?
と *
そしてそれらを非ワイルドカードとして利用するためのエスケープ文字 ~
が使用できます。
恥ずかしながら私は今回始めてこのページを見ました:
その上で、関数の特性も重要です。
正確に言うと、ワイルドカードの解釈を巡って、関数ごとに挙動が異なるという点の理解が重要です。
ここでは、CONTIF(範囲, 検索条件)
と VLOOKUP(検索値, 範囲, 列番号, [検索方法])
を比較してみます。
?
や*
の基本的なマッチングについては違いはありません。
- 値
smith
やsmyth
に対して、クライテリアsm?th
はマッチします。 - 値
East
やSoutheast
に対して、クライテリア*east
はマッチします。 - 値
fy06?
にはfy06~?
が、fy06*
にはfy06~*
が、それぞれマッチします。
以上の点で、2つの関数でマッチの成否に違いはありません。
では 値 ~?fy06
に対して、クライテリア ~?fy06
はどうでしょうか?
COUNTIF()
も VLOOKUP()
もマッチしません。
?
が ~
によってエスケープされ、ワイルドカードではなくただの文字として扱われることになるので、想定通りの結果です。
ではさらに 値 ~~fy06
に対して、クライテリア ~~fy06
はどうでしょうか?
COUNTIF()
は マッチします が、 VLOOKUP()
はマッチしません。
おや?となりますよね。
これと値 ~fy06
に対して、クライテリア ~~fy06
はどうでしょうか?
COUNTIF()
は マッチしません が、 VLOOKUP()
はマッチします。
この通り、 ~
で ~
をエスケープするクライテリアを COUNTIF()
はサポートしていない ようです。
加えて、
値 ~fy06
に対して、クライテリア ~fy06
は、COUNTIF()
はマッチ、 VLOOKUP()
は非マッチ。
値 fy06
に対して、クライテリア ~fy06
は、COUNTIF()
は非マッチ、 VLOOKUP()
は マッチ。
つまり、VLOOKUP()
は ~~
→ ~
というエスケープに加えて、 ~(非ワイルドカード)
→ (非ワイルドカード)
というエスケープ(?)もサポート している。
これは重大な違いです。
このような違いがなぜあるのかわかりませんが、値の中に ~
が含まれる場合、使用する関数によってマッチしたりマッチしなかったりするということです。
検索クライテリアを使用する関数は多数ありますが、それらを利用する場合、「ワイルドカードを使うつもりがあるかないか」に関わらず、ワイルドカードとそのエスケープシーケンスに要注意(意図せずマッチに失敗する可能性)ということです。