VBAマクロ、特に多くのセルを操作するループ処理などを実行した際に、「処理が遅い」「画面がチカチカして見づらい」と感じたことはありませんか?
その原因は、ExcelがVBAによる一つ一つの操作を、律儀に画面へ逐一描画しているからです。
この記事では、この画面描画を一時的にオフにすることで、VBAマクロの処理速度を劇的に向上させる、最も基本的で効果的なテクニックApplication.ScreenUpdating
を解説します。
なぜ画面の更新を止めると速くなるのか?
VBAがCells(1, 1).Value = "A"
のようなコードを実行すると、Excelはその結果を即座に画面に反映(再描画)しようとします。これを1万回繰り返すループ処理では、1万回の画面更新が発生します。
画面描画は、コンピュータにとって非常に負荷の高い処理です。そのため、処理の大半が「画面の更新」という待ち時間に費やされ、マクロ全体のパフォーマンスが著しく低下します。
Application.ScreenUpdating = False
は、この描画処理を**「マクロがすべて終わるまで一旦ストップして、最後に一度だけ結果を描画して」**とExcelに指示する命令です。これにより、無駄な待ち時間がなくなり、VBAは本来の処理能力を最大限に発揮できます。
完成したVBAコード(エラー処理を含む推奨パターン)
ScreenUpdating
をFalse
にした場合、万が一マクロがエラーで中断すると、画面が更新されないままになってしまう危険があります。それを防ぐため、エラーが発生しても必ずTrue
に戻すエラーハンドリングを組み込むのが鉄則です。
Sub FastProcessingWithScreenUpdating()
'--- 1. 処理の最初に画面更新をオフにする ---
Application.ScreenUpdating = False
' エラーが発生しても必ず画面更新をオンに戻すための準備
On Error GoTo ErrorHandler
'--- 2. メインの処理 ---
' (例:10000個のセルに値を入力する重い処理)
Dim i As Long
For i = 1 To 10000
ThisWorkbook.Worksheets("Sheet1").Cells(i, 1).Value = "Test " & i
Next i
'--- 3. 処理の最後に必ず画面更新をオンに戻す ---
ExitRoutine:
Application.ScreenUpdating = True
MsgBox "処理が完了しました。"
Exit Sub ' エラーハンドラを通過させないため
ErrorHandler:
' エラー発生時にここへジャンプ
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
' 画面更新をオンに戻すため、ExitRoutineへ進む
Resume ExitRoutine
End Sub
パフォーマンスの比較
ScreenUpdating
の効果を体感するために、以下の2つのコードを実行して速度を比較してみてください。
'--- Before: 画面更新がオンのまま(遅い) ---
Sub SlowLoop()
Dim i As Long
For i = 1 To 20000: Cells(i, 1).Value = i: Next
End Sub
'--- After: 画面更新をオフ(速い) ---
Sub FastLoop()
Application.ScreenUpdating = False
Dim i As Long
For i = 1 To 20000: Cells(i, 1).Value = i: Next
Application.ScreenUpdating = True
End Sub
データ量によっては、処理時間が数十倍から数百倍も変わることが分かります。
まとめ
VBAマクロの高速化における、最も重要で、最初に覚えるべきパターンは以下の通りです。
- マクロの開始直後に
Application.ScreenUpdating = False
を記述する。 - (推奨)エラーが発生しても必ず元に戻るよう、エラーハンドリングを記述する。
- マクロの終了直前に、必ず
Application.ScreenUpdating = True
を記述して画面更新を元に戻す。
大量のセル操作、シートの追加・削除、書式設定など、画面に変化が起きるほとんどの処理は、このおまじないで囲むだけで劇的に高速化します。VBAのパフォーマンスに悩んだら、まず最初にこの設定を見直してみてください。