〖ExcelVBA〗処理速度を上げる3点セット|画面更新・計算・イベントを止めて爆速化する基本コード

ExcelVBA

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「基本部品」として入れておいてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

タイトルとURLをコピーしました