VLOOKUPで大量のデータを高速に扱いたい

大量のデータをVLOOKUPで高速に扱いたい

日々業務の中で、SQLで抜いてきた大量のデータを扱っています。
VLOOKUPします。

重いです。

使っているパソコンの性能もありますが、非常に重いです。
延々計算しているかと思ったら、いつの間にかひっそりとお亡くなりになっていたりします。
えぇ。待てど暮らせど戻ってはこず。静かに再起動です。

なにかちょこっといじればそれでもう再計算。
以下、繰り返し。。。

あ゛あ゛あ゛あ゛あ゛~!!

大量のデータを高速にVLOOKUPしちゃいたい!!

で、四苦八苦したのを本日のデジタルストック。

スポンサーリンク
Simplicityレクタングル(大)

VLOOKUPってなんで遅いの?

書式:VLOOKUP(検索値, 範囲, 列番号, 検索の型)

VLOOKUPの書式は上記のとおり。
検索する言葉を検索する範囲の一列目を見て、該当する列にある値を返してくれます。
検索の型はFALSEにすると思います。

これってどういうことかというと、頭から順番に検索するデータと同じものをみつけるまで一個一個、中身を見ていくっていうこと。

少々のデータならまぁ平気でも、扱うデータが10万件、20万件となったらどうでしょう?
あ゛あ゛あ゛あ゛あ゛~!ってなりますよね。

コツはあるけれど近似一致にすると早くなる

検索対象のデータをあらかじめ小さい順(昇順)に並び替えておく必要がありますが、近似一致の探索にするとすごく早くなります。はず。

近似一致というのは検索の型をTRUEにすることで、二分探索を行ってくれる。。。
という理解であってるはず。

二分探索というのは、なんかアルゴリズムで見たぞ?

対象データ範囲の真ん中を比較して、一致すればそれを返す。
一致しなかった場合、検索値より小さければ、そこから手前はすべてハズレ。
検索値より大きければ、そこから後ろはすべてハズレ。
ハズレではない方の検索データ範囲の真ん中を比較して・・・。

そうそう、そんな感じで探索してくれるのです。
だから、昇順に並び替えておく必要があります。

それと、もうひとつ。
近似一致なんです。まったく同じものがない場合、それに近いものを返しちゃいます。
返しちゃうんです。だって近似一致だから。

二分探索では完全一致な検索ないんです。

二分探索でもって完全一致な値を返すVLOOKUP

二分探索が早いのはわかりました。
TRUEで返った値が、検索元のデータと同じかどうがっていう数式をつけ足せばいいんじゃない?
ってことです?

=IF(VLOOKUP(A1,顧客!A:A,1,TRUE)=A1,VLOOKUP(A1,顧客!A:B,2,TRUE),NA())

IF関数の書式は下記のとおりです。
書式:IF(条件, TRUE の処理, FALSE の処理)

最初のVLOOKUPで”検索値”と、”参照先の検索値の入っている列”を参照した結果を比較して、検索値と同じであれば再度VLOOKUPで必要な列の値を答えてもらう(検索値が一致しているのだから完全一致な答えが返ってきてるはず)
FALSEであった場合は存在しないっていうことなので、NA()を返します。

他にも方法はあると思いますが、素直に考えてみました。

スポンサーリンク
Simplicityレクタングル(大)
Simplicityレクタングル(大)

フォローする