子宝どっとこむ

 

 (Excel)あるかないかをCountIF関数で調べるわけ

あるデータがテーブル範囲の中にあるのかないのかを調べたい場合に、CountIF関数を使うわけですが、Match関数でもできますし、むしろMatch関数の方が直感的に分かりやすいのに、なぜCountIF関数を使うのでしょうか。

CountIF関数の本来の趣旨は条件に合致したデータが何個あるかを返す関数であり、あるかないかを調べる場合、返り値がゼロかゼロでない(1)かで判定し、趣旨に照らすと少しトリッキーな用法と言えなくもありません。

ということで、なぜ「あるかないかを調べたい」場合にCountIF関数を使う伝統が生まれたのかを考察してみることにしました。

最初、速度に鍵があるのかと考えました。というのは、Match関数には第3引数(照合の型)があり、これにより、完全一致(:0)、検索値以下の最大値(:1、昇順並び替えが前提)、検索値以上の最小値(:-1、降順並び替えが前提)の3つのタイプから選べます。

これに対して、CountIF関数は照合の型の指定が不要である分、関数のソースコードがシンプルである可能性が考えられ、Match関数よりも高速に処理できるという推測が成り立ちます。

しかし、実際問題、両者にさほどの速度差があるようにも思えませんし、そうした報告も見当たりません。引数に対応してソースコードは場合分けされて多少長いかもしれませんが、処理されるステップ数は引数によってジャンプしますのでたいしたことはないでしょう。

更に言えば、マシンパワーが充実した今日においては、多少の速度差で優位でも、直感的に分かりにくいソースは書くべきではないのと同じ理由で、直感的に分かりにくい関数の用法はすべきではないとの論法が成り立つとも言えます。

さて、それではMatch関数であるかないかを調べるか、と取り組みますと、ちょっと困ったことが生じます。そもそも、Match関数は検索値がテーブル範囲(配列)に存在した場合に、その配列番号を返す関数です。そして、見つからなかった場合には#N/Aエラーを返します。

つまり、「あればこうする、なければこうする」と考えていたときに、CountIF関数を使っていれば「結果が1ならこうする、結果が0ならこうする」と数式を組めばいいのですが、Match関数の場合は「結果がエラーでなければこうする、結果がエラーならこうする」という風に回りくどいので、直感的だけども混乱するロジックとなってしまうわけです。

例えば、入力した氏名がブラックリストに載っているかどうかを調べたいとき、

=IF(COUNTIF(ブラックリストテーブル,検索値),"ブラックリスト","")
=IF(ISNA(MATCH(検索値,ブラックリストテーブル,0)),"","ブラックリスト")
=IF(ISERROR(MATCH(検索値,ブラックリストテーブル,0)),"","ブラックリスト")
=IF(ISNUMBER(MATCH(検索値,ブラックリストテーブル,0)),"ブラックリスト","")
=IF(ISNA(VLOOKUP(検索値,ブラックリストテーブル,1,FALSE)),"","ブラックリスト")
=IF(ISERROR(VLOOKUP(検索値,ブラックリストテーブル,1,FALSE)),"","ブラックリスト")
=IF(ISTEXT(VLOOKUP(検索値,ブラックリストテーブル,1,FALSE)),"ブラックリスト","")

いずれでもよいのですが、ネスとしないで済むだけにCountIF関数が結果的に分かりやすいという結論になるのでしょう。おそらくこれが伝統化された理由だと思います。

今日見つけた上級者向けサイト

 Trackback Pings(0)

No trackbacks found.

 Comments(0)

No comments found.

 Post a Comment

コメント用フィード