先日大量データのVLOOKUP高速化をやりましたが、VLOOKUPより遅いのがCOUNTIF!
VLOOKUPは見つけたらほいっとそこで終わり、に比してCOUNTIFは「この中に何個あるか」なので最後まで探しに行かなきゃいけないから、時間がかかるのも納得。
で、COUNTIFを早くする方法を考えてみました。
で、編み出した方法はピボットとVLOOKUPの合わせ技で、COUNTIFと同じ結果を得る方法です。
なので「COUNTIFを高速化する」というわけではない。別の手段を使って高速化、です。
1.COUNTIFを高速化
まず、わかりやすいように小さいデータでやってみます。
下図の表でやってみます。
A列にIDがあります。このIDがE列に何個あるかを数えたい。E列は200行目まであります。
数えた結果をB列に出力します。
(1)普通のCOUNTIF
まず、普通にCOUNTIFを入力してみます。
こうですね。
=COUNTIF($E$2:$E$200,A2)
(2)ピボットテーブルでの集計とVLOOKUPの合わせ技でCOUNTIFを実現する方法
次にピボットテーブルとVLOOKUPの合わせ技でCOUNTIFを実現する方法をやってみます。
①まず、E列のデータを選択してピボットテーブルでID毎のデータの個数を集計します。
合計ではなく、個数にするのを忘れずに!
ピボットテーブルはコピーして値貼り付けしておきます。集計したい表の横っちょにでも貼り付けします。
②VLOOKUPを使って、ピボットテーブルで集計した個数をB列に出力します。
③これでもそこそこ早くなりますが、VLOOKUPの近似値を使うと、もっと早くなります。
近似値を使ったVLOOKUPの高速化方法はこちらの記事をご参照ください
【Excel/関数】大量データのVLOOKUPをウソみたいに早くする方法
近似値を利用する場合、VLOOKUPの参照範囲は昇順に並べておく必要があります。ピボットテーブルなので、通常は昇順に並んでいるはずですが、昇順でない場合は並べ替えを行ってからVLOOKUPをかけます。
VLOOKUPの近似値は検索方法にTRUE(または1)を指定します。
キーが一致することを確認するためIF式をかまします。VLOOKUP近似値で1列目を持ってきて、それがキーと一致していたらVLOOKUP近似値で2列目を持ってくる式に入ります。キーが一致していなければ「参照範囲内にキーがない」ということなので「0」を返すようにします。
ちょっと長くなりますが。
=IF(VLOOKUP(A3,$G$4:$H$13,1,1)=A3,VLOOKUP(A3,$G$4:$H$13,2,1),0)
これで、COUNTIFと同じ答えが返ることになります。
2.大量データでやってみる~時間の比較~
大きいデータでやってみます。
50万行のデータを100万行のデータの中からカウントします。
(1)普通にCOUNTIFした場合。
再計算〇%・・・で約16分かかりました。
(2)ピボットとVLOOKUP近似値の合わせ技でやってみる
ピボット集計とVLOOKUPと合わせて2分とかからなかったのでは?というスピード感。
COUNTIF自体を高速化するわけではないですが、合わせ技で高速化実現。もしよかったら使ってみてください!お読みいただきありがとうございました。
コメント