VBAで作ったマクロが、
- 動きが遅い
- 画面がチカチカして見づらい
- 大量データだと終わらない
…ということはよくあります。
こういうときに最初に試してほしいのが、処理速度を上げる3点セットです。
これは、Excelの「余計な動き」を一時的に止めることで、マクロを一気に高速化する基本テクニックです。
処理速度を上げる3点セットとは?
以下の3つを、マクロ実行中だけOFFにします。
- 画面更新を止める(画面が動かないので速い)
- 自動計算を止める(再計算が走らないので速い)
- イベントを止める(Worksheet_Changeなどが発火しないので速い)
そして、処理が終わったら必ずONに戻します。
これが「基本」かつ「最重要ポイント」です。
まずは結論:そのまま使える高速化テンプレ(コピペOK)
以下は、実務で使える安全なテンプレです。
「必ず元に戻す」仕組みを入れています。
Option Explicit
Sub SpeedUpTemplate()
Dim prevCalc As XlCalculation
Dim prevScreen As Boolean
Dim prevEvents As Boolean
On Error GoTo Finally
' 現在の状態を退避(元に戻すため)
prevCalc = Application.Calculation
prevScreen = Application.ScreenUpdating
prevEvents = Application.EnableEvents
' ===== 高速化3点セット ON =====
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
' ===============================
' ここにメイン処理を書く
' 例:大量のセル更新、ループなど
Finally:
' ===== 必ず元に戻す(超重要) =====
Application.ScreenUpdating = prevScreen
Application.Calculation = prevCalc
Application.EnableEvents = prevEvents
' ==================================
If Err.Number <> 0 Then
MsgBox "エラーが発生しました。" & vbCrLf & _
"番号:" & Err.Number & vbCrLf & _
"内容:" & Err.Description, vbExclamation
End If
End Sub
このテンプレをベースにしてマクロを書けば、
速くて、戻し忘れ事故も起きにくいマクロになります。
各設定の意味(初心者向けにやさしく解説)
① 画面更新を止める(ScreenUpdating)
Application.ScreenUpdating = False
Excelはセルを書き換えるたびに画面を更新しようとします。
大量処理だと、その更新が重くなります。
OFFにすると、画面表示の更新が止まるので、処理が速くなります。
(処理は裏で進み、終わったらまとめて画面が更新されるイメージ)
② 自動計算を止める(Calculation)
Application.Calculation = xlCalculationManual
Excelは通常、セルの値が変わるたびに数式を再計算します。
大量にセルを書き換える処理では、再計算が何百回・何千回も走って遅くなります。
手動にすると、途中の再計算が止まるので速くなります。
必要なら最後に再計算を実行できます。
Application.Calculate
③ イベントを止める(EnableEvents)
Application.EnableEvents = False
VBAには、セル変更時などに自動で動く仕組み(イベント)があります。
例:
- Worksheet_Change(セルが変わったら動く)
- Workbook_Open(開いたら動く)
マクロがセルを大量に変更すると、それに反応してイベントが何度も動き、遅くなることがあります。
OFFにすると、イベントが発火しないので安定して速くなります。
よくある失敗:戻し忘れが一番危険
高速化の落とし穴は、これです。
- ScreenUpdating を False のままにして画面が動かない
- Calculation が Manual のままで数式が更新されない
- EnableEvents が False のままで他のマクロが動かない
だからこそ、この記事で紹介したように状態を退避して必ず戻すテンプレが重要です。
実例:大量セルに値を入れる処理を高速化する
例として、A2:A50000に値を入れる処理を考えます。
3点セットを入れるだけで体感が大きく変わります。
Option Explicit
Sub FillManyCellsFast()
Dim prevCalc As XlCalculation
Dim prevScreen As Boolean
Dim prevEvents As Boolean
Dim ws As Worksheet
Dim r As Long
On Error GoTo Finally
Set ws = ActiveSheet
prevCalc = Application.Calculation
prevScreen = Application.ScreenUpdating
prevEvents = Application.EnableEvents
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
For r = 2 To 50000
ws.Cells(r, 1).Value = "OK"
Next r
Finally:
Application.ScreenUpdating = prevScreen
Application.Calculation = prevCalc
Application.EnableEvents = prevEvents
If Err.Number <> 0 Then
MsgBox "エラー:" & Err.Number & vbCrLf & Err.Description, vbExclamation
End If
End Sub
さらに速くする小技(必要な人だけ)
3点セットだけでも効果は大きいですが、さらに速くしたい場合は以下も有効です。
① クリップボード点滅を止める
Application.CutCopyMode = False
② ステータスバー表示を抑える(使うなら最後に戻す)
Application.StatusBar = "処理中..."
' 終了時
Application.StatusBar = False
ただし、まずは3点セットが基本です。
まとめ:重いマクロはまず「3点セット」を入れる
- ScreenUpdating = False(画面更新を止める)
- Calculation = Manual(再計算を止める)
- EnableEvents = False(イベント発火を止める)
そして、最重要なのが必ず元に戻すことです。
この記事のテンプレをそのまま使えば、速くて安全なマクロになります。
ぜひ、あなたのVBA「基本部品」として入れておいてください。


コメント