スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
VBA 処理速度の改善


覚書のために、簡単にまとめとく。

エクセルVBAの処理速度改善の方法はたくさんあります。

根本的な解決としては、無駄のない適切なアルゴリズムを使うことなんだろうけど、
簡単な対応方法としては何個か。

たった1文加えるだけで、処理速度が大きく改善するかもしれません。

1.画面更新を止める。
2.いちいちselectしない。
3.ループを途中で抜ける。
4.処理をOSに戻す。


ぱっと思いつくのは、こんなもんでしょうか。
順に説明します。

1.画面描画を止める。

以下の1文を処理開始時に入れることで、画面の描画(ちらつき)を止めることができます。
(処理開始時に「処理を開始します。よろしいですか。」といった
メッセージを出力する場合は、処理の先頭ではなく、メッセージを出した後に追加しましょう。
描画更新を止めたにも関わらず、メッセージを出力するなんて処理の流れは矛盾しています。)

Application.ScreenUpdating = False


処理の最後には、

Application.ScreenUpdating = True

としておきましょう。処理終了時に自動的にこの設定値はTrueになるようですが、
念のため元に戻しておきましょう。
まれに不具合が生じることがあるようです。設定が戻らなかったり?

参考ページは忘れましたが、実際に思い当たる節として、
処理の途中にエラーで処理を中断した際、ワークシートをクリックしても反応しないことがあった気がします。

これって、処理開始時に画面描画を停止したままだからって考えると話が通る気がします。




2.は、いちいちセル選択しなくても値をぶち込めますってことです。
マクロの記憶なんかでは、どこどこのセルをselectして~とかあると思いますが、
そんな記述は特に必要ないです。直接ぶち込みましょう。

3.Forループとかをぐるぐるまわしすぎるのはよくありません。
ループの途中でほしい値が取得できたりして、それ以降のループを回す必要がないならループを抜けましょう。
VBAにはcontinueはありませんので、gotoを使えってのがよくある話ですが。。。
個人的にはgotoは嫌いです。処理が追いづらくなるからです。

ForEachを使ったり、何らかの方法でgoto文を書かずに済む方法を模索しましょう。

4.ループを回しすぎると負荷がかかります。処理が途中で停止したままなんてことも。

やけに処理に時間がかかるなんてことありませんか?
でも、実行中にマウスをぽちぽちクリックしてやるとすんなり処理が進むなんてことありませんか?

ループを回すときは適度にOSに制御を戻してやってください。
DoEvents


これで、処理が極端に遅くなるのを回避できるかもしれません。
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。