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 の三点セットが鉄板。
- 配布コード: 現状復帰の安全ラップを必ず入れる。
