Excel VBAでプログラミングしていて、「処理が遅くて困った」、あるいは「処理が全て終わらないでフリーズしてしまった」、なんていう経験はありませんか。
今回はそんな時に回避する方法の一つをご紹介します。
以前、Excelの行と列、それぞれ数百、数千と並んだランダムのデータから、重複したもののみリストアップするプログラムを作ったことがあります。
データ件数は数万件、場合によっては数十万件にも及びます。
このプログラムの考え方としては、以下のとおりです。
- 二つの二次元配列を用意する。
- それら二つの二次元配列にExcelデータを入れる。
- 二つの二次元配列のデータを比較しながら、重複していたら別シートにリストアップしていく。
おわかりのとおり、データを比較する処理はループを入れ子にする必要がありますから、相当回数、ループを回さなければなりません。
私の低スペックPCに、この処理は相当負荷がかかったらしく、フリーズしてしまい処理を全て終わらせることができませんでした。
負荷を回避するために、さまざまな方法があるでしょうが、今回はDoEventsを使った回避方法をご紹介します。
処理が遅いと思ったらDoEvents
Excel VBAのDoEventsは、負荷がかかるであろう処理をオペレーティングシステムに任せてしまう役割があります。
負荷がかかった処理をオペレーティングシステムに渡してしまうことで、次の処理を移ることができるわけです。
負荷がかかるのは主に繰り返し(ループ)処理でしょう。
使い方はいたって簡単で、Forループの内側に一行、書き込むだけ。
コードは割愛しますが、For~の次の行にでも書いておけば大丈夫です。
「処理が遅くて困った」、「プログラムを実行させるとPCがフリーズしちゃう」、なんていう問題に直面したら、とりあえずDoEventsを書いちゃいましょう。
先ほどの処理だって、DoEventsを入れただけで、私の低スペックPCで処理を終わらせることができたから驚きです。