マクロが遅くて困っていませんか?
「マクロを実行すると、なぜか動きが遅い…」
そんな悩みを抱えたまま、なんとなく放置している方も多いのではないでしょうか。
マクロの処理速度が遅くなる原因はさまざまですが、実は簡単な設定を見直すだけで劇的に改善することがあります。
マクロを高速化するためにまず見直したい5つのポイントを解説します。実務でありがちなケースに絞っているので、参考にしてみてください。
1. 画面更新の停止
コード例
Application.ScreenUpdating = False
' メイン処理を書く
Application.ScreenUpdating = True
Excelはマクロの実行中も、セルの値や色が変わるたびに画面上もその動作をするようになっています
この操作を画面で表示しようと思うと、画面に表示するために多くのパワーを使うので、動作が遅くなります。
そのため、最初に「Application.ScreenUpdating = False」と決まった言葉を入れることにより、画面上は操作状況を表示せず、処理が終われば、処理結果のみ表示する、設定をすることができます。
これについては、処理が終われば、元の設定に戻したいので、処理が終わったあとに True に戻すのが基本です。
2. 自動計算の一時停止
コード例
Application.Calculation = xlCalculationManual
' メイン処理を書く
Application.Calculation = xlCalculationAutomatic
マクロ実行中に数式がたくさん含まれているシートを扱うと、何度も再計算が走ってしまい処理速度が落ちることがあります。
特に足し算や引き算などの四則演算や、関数を使った処理をしていると、すべてのセルで再度、動くことになるので、そのような内容が入っているセルが多ければ多いほど、動作が遅くなります。
このような場合、一時的に計算モードを手動に切り替えることで、無駄な再計算を防止できます。
こちらも画面更新の停止と同様に「xlCalculationManual」で「手動」にした後に、最後には「xlCalculationAutomatic」で「自動」に戻すのが基本です。
3. イベント処理の停止
コード例
Application.EnableEvents = False
' メイン処理を書く
Application.EnableEvents = True
シート変更時に自動で動くイベント(Worksheet_Change など)があると、マクロの途中で意図しないタイミングで別の処理が動いてしまい、遅くなる原因になります。
イベントというのは上記の「シートが変わった時(Worksheet_Change)」や「セルを選択した時」など、何か操作をした時に、その操作をした場合に何かしら動作を行うことです。
シートが選択されれば、A1を選択してください、などの動作をさせることです。
マクロ動作中はその動作が不要であれば、処理中にイベントが走らないよう、EnableEvents をFalseにしておくのが安全です。
4. 不要な選択・アクティブ化をしない
コード例
' 遅くなる書き方
Sheets("データ").Select
Range("A1").Select
ActiveCell.Value = "売上"
' 速くて正しい書き方
Sheets("データ").Range("A1").Value = "売上"
Select や Activate を多用すると、処理が遅くなるだけでなく、エラーの原因にもなります。
直接セルやオブジェクトを指定する書き方に慣れておくと、読みやすく・速いマクロになります。
5. With構文でコードを簡潔に
コード例
With Sheets("入力")
.Range("B2").Value = "OK"
.Range("B3").Value = "NG"
.Range("B4").Value = "OK"
End With
同じオブジェクト(例:1つのシート)に対して複数回処理をする場合、With ~ End With を使うとコードが簡潔で、VBA的にも効率的です。
特にシートやRangeを繰り返し使う処理では、積極的に使いたい構文です。
実装するメリット
今回ご紹介した5つの見直しポイントを活用することで、
- マクロの処理速度が格段に上がる
- 無駄な動作を減らせる
- エラーや予期せぬ処理を防げる
- コードがシンプルで保守しやすくなる
といった効果があります。
これは特にデータ量が多いシートや、複数の操作を含むマクロで強く実感できます。
まとめ
マクロが重くなったとき、原因を特定するのは意外と難しいものです。
まずは、次の5つを確認してみてください。
- 画面更新の停止(ScreenUpdating)
- 自動計算の停止(Calculation)
- イベント処理の停止(EnableEvents)
- 不要なSelect/Activateの排除
- With構文による効率化
これらを押さえるだけで、マクロはぐっと軽く、快適に動くようになります。
一度テンプレート化しておくと、どのマクロにも使いまわせるので、ぜひご活用ください!
