出来た仕事は、自作のVBAツールの高速化。
異常データの除去と、名寄せです。
かなりな量のデータを処理するので、ひどい場合は20分近く、かかる処理でした。
最初に入れたのは、「FindNext」
一度検索した後、「次を検索」する命令です。
元々は、一個一個調べていたので、「Find」でも早くなるかな、と。
でも、あんまり早くならないんです。
そこで、たまたま検索で知った、「FindNext」を試すと…
時間は、半分に。
元の検索条件をそのまま使い、しかも見つかった場所から次を探すので、効率がよくなったらしいです。
なお、「FindNext」は最後の検索の後、「振り出しに戻る」ので、終了させるのに工夫が要りますが(最初の検索結果を控えて照合)、今回は検索結果を加工しちゃうので、そのまま検索結果がゼロ(Nothing)になり、検索が終了します。
そうやって、プログラムを動かしては止め、動かしては止めしながら、データの処理模様を眺めていくと…
あることに、気づいたんです。
データはまず、異常データを除去します。
データの5%ほどですが、調べたら、最大万単位の量。
結構な量を処理します。
時間的にも、大半をここで消費するんです。
この後、名寄せを行って、重複データを最新のものを残して、残りは削除します。
ここでも時間はかかりますが、先ほどの処理ほどではありません。
ただし…
実はここで、劇的にデータが減るんです。
行単位で削除するので、時には何十分の一にもなります。
「だったら、先に名寄せを行った方が、速くならない?」
ルーチンを、組み替えてみました。
そしたら、時間はさらに、五分の一に!
劇的に、速くなったんです♪
…設計って、大切ですね。
今回は後から機能を付け加えて、こうなったんですけどね。
機能をつける時は、不具合の対処ですから、精一杯。
でも、データの流れを見て、処理を組み立てて行く必要があると、感じましたね。
いろいろ、勉強になりました。