簡単にExcelマクロを高速化する方法
この記事は最終更新から4年以上が経過しています。情報が古くなっている可能性があります。
WPのカスタマイズ案件にお手伝いさせていただいたときのことです。
依頼の一部で、データをとあるフォーマットに変換するマクロの作成を
プログラマーさんにお願いしたのですが、
なんと私の環境だと実行開始-完了まで15〜20分かかる…!
今後も運用したいマクロでなんとか時短したかったため、
勉強をかねてマクロの高速化の手法について調べてみました。
今回は以下の記事を参考にさせていただきました。
- エクセルVBA高速化|手法一覧
- Office TANAKA – Excel VBA高速化テクニック[目次]
- VBA マクロ高速化のために停止すべき3項目 – t-hom’s diary
- Excel VBA 高速化アプローチ【プロパティ編】 | Dev-Clips
特に上2記事は何%高速になったか数値を出しておられているのでわかりやすかったです!
この中で、今回のマクロの処理に影響せず、より高速化の恩恵を得られそうな方法を実装してみました。
実装した処理
画面更新制御
※こちらは処理が完了するまで完全に画面更新を非表示にしていますが、
ユーザに完全に処理を見せない!ということが問題なら、「半非表示」などの対応もできるようです
ステータスバー更新制御
イベント発生制御
ワークシートオブジェクトの変数代入
いくつかのシートを跨いで処理するマクロなのですが、毎回シート名を指定して呼び出していました。
とりあえず変数入れた方が早いような気がしたので以下のように修正。
↓
これ以外にも、「とあるシートの値を別シートのセルにいれる」という処理を都度していたので、
- とあるシートの必要な値を全部配列にぶちこむ
- 別シートに全部出力する
という変更も試してみたかったのですが、さすがに全部作りなおすのは大変なので今回はやめました。
検証結果
回ごとに異なるデータを対象に、それぞれのマクロで処理した結果です。
修正前 | 修正後 | |
---|---|---|
1 | 00:02:47 | 00:01:52 |
2 | 00:17:47 | 00:01:33 |
3 | 00:16:00 | 00:01:52 |
平均 | 00:12:11 | 00:01:45 |
修正前マクロの最初のぶれが気になりますが、それを含めても12分強から2分弱へスピードアップが実現しました!
(それでもちょと遅いけど気にしない)
まとめ
マクロは普段使いませんが、何気に時間がかかる作業を短縮してくれますよね。
処理内容から見直さなくても、これだけの処理速度を簡単にあげることができるので、マクロの内容に影響がない範囲で高速化できるコードを使ってみるといいかもしれません。