【Excel VBA】マクロを高速化する基本中の基本 Application.ScreenUpdating = False

VBAマクロ、特に多くのセルを操作するループ処理などを実行した際に、「処理が遅い」「画面がチカチカして見づらい」と感じたことはありませんか?

その原因は、ExcelがVBAによる一つ一つの操作を、律儀に画面へ逐一描画しているからです。

この記事では、この画面描画を一時的にオフにすることで、VBAマクロの処理速度を劇的に向上させる、最も基本的で効果的なテクニックApplication.ScreenUpdatingを解説します。


目次

なぜ画面の更新を止めると速くなるのか?

VBAがCells(1, 1).Value = "A"のようなコードを実行すると、Excelはその結果を即座に画面に反映(再描画)しようとします。これを1万回繰り返すループ処理では、1万回の画面更新が発生します。

画面描画は、コンピュータにとって非常に負荷の高い処理です。そのため、処理の大半が「画面の更新」という待ち時間に費やされ、マクロ全体のパフォーマンスが著しく低下します。

Application.ScreenUpdating = Falseは、この描画処理を**「マクロがすべて終わるまで一旦ストップして、最後に一度だけ結果を描画して」**とExcelに指示する命令です。これにより、無駄な待ち時間がなくなり、VBAは本来の処理能力を最大限に発揮できます。


完成したVBAコード(エラー処理を含む推奨パターン)

ScreenUpdatingFalseにした場合、万が一マクロがエラーで中断すると、画面が更新されないままになってしまう危険があります。それを防ぐため、エラーが発生しても必ず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マクロの高速化における、最も重要で、最初に覚えるべきパターンは以下の通りです。

  1. マクロの開始直後Application.ScreenUpdating = False を記述する。
  2. (推奨)エラーが発生しても必ず元に戻るよう、エラーハンドリングを記述する。
  3. マクロの終了直前に、必ず Application.ScreenUpdating = True を記述して画面更新を元に戻す。

大量のセル操作、シートの追加・削除、書式設定など、画面に変化が起きるほとんどの処理は、このおまじないで囲むだけで劇的に高速化します。VBAのパフォーマンスに悩んだら、まず最初にこの設定を見直してみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次