概要:マクロの「ちらつき」を封じ込め、実行速度を極限まで高める
Excel VBAを習得する過程で、多くの開発者が最初に直面する壁が「マクロの実行速度」と「画面のちらつき」です。特にデータ量が多いワークシートを操作する際、画面が激しく点滅し、処理が終わるまでに長い時間を要する経験をしたことはないでしょうか。これは、Excelがマクロの命令一つひとつを律儀に画面へ描き直そうとするために発生する「オーバーヘッド」が原因です。本記事では、VBAのパフォーマンスチューニングにおける第一歩であり、最も効果的なテクニックである「画面更新の停止(ScreenUpdating)」について、その仕組みと実装方法を徹底的に解説します。
詳細解説:なぜ画面更新を止めると速くなるのか
Excelはデフォルト設定において、セルへの値の書き込みやシートの選択といったアクションが発生するたびに、その結果を視覚的にユーザーへフィードバックしようとします。このプロセスを「再描画」と呼びます。数行のコードであれば問題になりませんが、数千行、数万行のループ処理を行う場合、この再描画の回数が膨大になり、PCのCPUとGPUに多大な負荷をかけます。
「Application.ScreenUpdating = False」を記述することで、Excelに対して「処理が完了するまで画面の再描画を一時停止せよ」という命令を送ります。これにより、計算結果が画面に反映されるのは「マクロが終了した瞬間」または「再描画を許可した瞬間」のみとなり、不必要な描画処理を完全にスキップすることが可能になります。結果として、処理時間は数倍から、時には数十倍にも短縮されます。
サンプルコード:安全かつ確実な画面更新制御の実装
実務における実装では、単に停止させるだけでなく、エラー発生時にも確実に再描画が有効になるよう「例外処理(Error Handling)」と組み合わせるのがプロの作法です。以下に、現場でそのまま使えるテンプレートを提示します。
Sub OptimizedMacro()
' 画面更新を停止する
Application.ScreenUpdating = False
' エラーハンドリングの設定
On Error GoTo ErrorHandler
' ----------------------------------------------------
' ここにメインの処理を記述します
Dim i As Long
For i = 1 To 10000
Cells(i, 1).Value = i
Next i
' ----------------------------------------------------
' 処理終了後、必ず再描画を有効に戻す
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
' エラー発生時も再描画を有効に戻さないと画面が真っ白のままになる
Application.ScreenUpdating = True
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub
実務アドバイス:なぜ再描画の解除を忘れてはならないのか
多くの初心者が陥る罠として、処理の途中でエラーが発生し、プログラムが途中で停止した際に「画面更新が停止したままになってしまう」というトラブルがあります。もし「Application.ScreenUpdating = True」に戻す処理が漏れたままマクロが終了すると、ユーザーはExcelがフリーズしたと錯覚します。セルを選択しても枠線が表示されず、スクロールも正しく行われないといった極めて不便な状態に陥るのです。
そのため、私の講義では必ず「エラーハンドリングとセットで記述すること」を徹底させています。また、非常に長い処理を行う場合は、途中で「DoEvents」関数を挟むことで、ユーザーがマクロを強制終了できるように制御することも推奨しています。プロフェッショナルなマクロとは、単に速いだけでなく、エラーに対して頑健(ロバスト)である必要があるのです。
さらなるパフォーマンス向上のヒント
画面更新の停止に加え、実務では以下の設定を併用することで、さらに劇的な高速化が可能です。これらは「四天王」とも呼ばれる最適化項目です。
1. Application.Calculation = xlCalculationManual(自動再計算を停止)
2. Application.EnableEvents = False(イベントの発生を停止)
3. Application.DisplayAlerts = False(警告メッセージを非表示)
これらとScreenUpdatingを組み合わせることで、数分かかっていた処理を数秒で終えることも珍しくありません。ただし、これらはすべて「処理が終わったら必ず元の状態(TrueやxlCalculationAutomatic)に戻す」という原則を忘れないでください。
まとめ:VBA開発の基本作法として定着させる
マクロ実行時の余計な画面を消す「Application.ScreenUpdating = False」は、VBA開発において最もコストパフォーマンスが高い最適化テクニックです。コードの冒頭に一行加えるだけで、ユーザー体験は劇的に向上します。
しかし、技術とはただ使うだけでなく、その裏側にあるリスク(エラー時のフリーズ等)を理解して制御してこそ真価を発揮します。今回の記事で紹介した「エラーハンドリングを伴う実装」をテンプレートとして保存し、今後作成するすべてのマクロで標準装備として活用してください。次回は、この「画面更新停止」とセットで考えるべき「自動再計算の制御」について、さらに深掘りして解説していきます。基礎を固めることが、複雑な業務を自動化する唯一の近道です。焦らず、一歩ずつプロの技術を身につけていきましょう。
