Line Buffer Overflow…

書くことが多過ぎるとき、バッファーとしてこちらに書きます。不定期更新です。

勉強になったこと…

出来た仕事は、自作のVBAツールの高速化。

異常データの除去と、名寄せです。

かなりな量のデータを処理するので、ひどい場合は20分近く、かかる処理でした。

 

最初に入れたのは、「FindNext」

一度検索した後、「次を検索」する命令です。

 

元々は、一個一個調べていたので、「Find」でも早くなるかな、と。

でも、あんまり早くならないんです。

 

そこで、たまたま検索で知った、「FindNext」を試すと…

時間は、半分に。

元の検索条件をそのまま使い、しかも見つかった場所から次を探すので、効率がよくなったらしいです。

 

なお、「FindNext」は最後の検索の後、「振り出しに戻る」ので、終了させるのに工夫が要りますが(最初の検索結果を控えて照合)、今回は検索結果を加工しちゃうので、そのまま検索結果がゼロ(Nothing)になり、検索が終了します。

 

そうやって、プログラムを動かしては止め、動かしては止めしながら、データの処理模様を眺めていくと…

あることに、気づいたんです。

 

データはまず、異常データを除去します。

データの5%ほどですが、調べたら、最大万単位の量。

結構な量を処理します。

時間的にも、大半をここで消費するんです。

 

この後、名寄せを行って、重複データを最新のものを残して、残りは削除します。

ここでも時間はかかりますが、先ほどの処理ほどではありません。

 

ただし…

実はここで、劇的にデータが減るんです。

行単位で削除するので、時には何十分の一にもなります。

 

「だったら、先に名寄せを行った方が、速くならない?」

 

ルーチンを、組み替えてみました。

そしたら、時間はさらに、五分の一に!

劇的に、速くなったんです♪

 

…設計って、大切ですね。

今回は後から機能を付け加えて、こうなったんですけどね。

機能をつける時は、不具合の対処ですから、精一杯。

でも、データの流れを見て、処理を組み立てて行く必要があると、感じましたね。

 

いろいろ、勉強になりました。