Excel VBA 逆引き集 | Application.ScreenUpdatingで高速化

Excel VBA
スポンサーリンク

Application.ScreenUpdatingで高速化

画面の再描画を一時停止すると、セル操作やコピー・貼り付けの体感速度が大幅に上がります。初心者でも安全に使えるテンプレートと、併用すべき設定、注意点をまとめました。


基本:最短の使い方

Sub SpeedUp_Simple()
    Application.ScreenUpdating = False  '画面更新を止める

    'ここに重い処理(コピー、書き込み、ループなど)
    Range("A1:B10000").Value = 1

    Application.ScreenUpdating = True   '最後に必ず再開
End Sub
VB
  • 効果の仕組み: 1セル書き込みごとの再描画を止め、まとめて最後に描画させることで待ち時間を削減。
  • 必須ポイント: False→True を「必ず」セットで使う。

実務の鉄板テンプレート(安全ラップ)

Sub SpeedUp_SafeTemplate()
    Dim scr As Boolean: scr = Application.ScreenUpdating
    Dim calc As XlCalculation: calc = Application.Calculation
    Dim ev As Boolean: ev = Application.EnableEvents

    On Error GoTo Cleanup

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    '==== 本処理(例:大量コピーや値書き込み) ====
    Range("C2:D50000").Value = Range("A2:B50000").Value
    '===========================================

Cleanup:
    '設定を必ず元に戻す(エラー時もここへ来る)
    Application.EnableEvents = ev
    Application.Calculation = calc
    Application.ScreenUpdating = scr
End Sub
VB
  • ポイント:
    • 元の状態を保持: 実行前の設定を記録→終了時に復元。
    • エラーハンドリング: 中断しても画面が戻るように必ずクリーンアップ。

併用でさらに速くする設定

  • Calculation(再計算停止):
    • Application.Calculation = xlCalculationManual → 数式の自動再計算を一時停止。最後に自動へ戻す。
  • EnableEvents(イベント停止):
    • Application.EnableEvents = False → Change/SelectionChange などのイベントを止める。
  • DisplayAlerts(確認ダイアログ抑止):
    • Application.DisplayAlerts = False → 上書き確認等を自動選択(終了時に True へ)。
  • StatusBar(進捗表示):
    • 長時間処理では進捗をステータスバーに出すと不安が減る。
Sub SpeedUp_WithProgress()
    On Error GoTo Cleanup
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    Dim last As Long, r As Long
    last = Cells(Rows.Count, "A").End(xlUp).Row
    For r = 2 To last
        '処理例
        Cells(r, "E").Value = Val(Cells(r, "C").Value) * Val(Cells(r, "D").Value)
        If r Mod 5000 = 0 Then
            Application.StatusBar = "処理中... " & r & "/" & last
        End If
    Next

Cleanup:
    Application.StatusBar = False
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
VB

具体的な使用例

例1:大量コピーを一瞬で値貼り付け

Sub Example_FastCopyValues()
    Application.ScreenUpdating = False
    Range("H2:K50000").Value = Range("C2:F50000").Value
    Application.ScreenUpdating = True
End Sub
VB

例2:フィルタ後の可視セルだけに書式適用

Sub Example_VisibleFormat_Fast()
    Application.ScreenUpdating = False
    Dim rg As Range, vis As Range
    Set rg = Range("A1").CurrentRegion
    rg.AutoFilter Field:=3, Criteria1:=">=80"

    On Error Resume Next
    Set vis = rg.Offset(1).Resize(rg.Rows.Count - 1).Columns(5).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If Not vis Is Nothing Then vis.Interior.Color = RGB(198, 239, 206)
    Application.ScreenUpdating = True
End Sub
VB

例3:数式列を一括で値化(表示は最後にまとめて)

Sub Example_FormulasToValues_Fast()
    On Error GoTo Cleanup
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    Dim f As Range
    On Error Resume Next
    Set f = Range("E2:E200000").SpecialCells(xlCellTypeFormulas)
    On Error GoTo 0
    If Not f Is Nothing Then f.Value = f.Value

Cleanup:
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
VB

よくある落とし穴と対策

  • Trueへ戻し忘れ:
    • 対策: 例のように「クリーンアップ」節を必ず用意。
  • 再計算を戻し忘れ:
    • 対策: Calculation も元へ必ず戻す(Automatic)。
  • イベント暴発/停止しっぱなし:
    • 対策: EnableEvents を False→True に。
  • 効果が薄いケース:
    • 見た目操作が少ない処理(配列計算のみ等)では効果は限定的。 それでも習慣化しておくと安心。
  • UserFormや画面に進捗が出ない不安:
    • 対策: StatusBar表示、所要時間の計測ログ(Timer)を併用。
Sub TimeLogging_Sample()
    Dim t As Double: t = Timer
    Application.ScreenUpdating = False
    '…本処理…
    Application.ScreenUpdating = True
    Debug.Print "処理時間(秒): "; Format$(Timer - t, "0.00")
End Sub
VB

まとめの使い分け

  • 短い処理: ScreenUpdating だけでも体感が上がる。
  • 重い処理(大量行・数式多い): ScreenUpdating+Calculation+EnableEvents の三点セットが鉄板。
  • 配布コード: 現状復帰の安全ラップを必ず入れる。
タイトルとURLをコピーしました