VBAテクニック集 VBA一覧 処理速度対策(VBA)

【VBA】Application.ScreenUpdatingプロパティの使用方法と特徴

Excel VBAで大量データを処理していると、

  • シート切り替え時に画面がチラつく
  • セル選択が何度も表示される
  • 処理自体は単純なのに異常に遅い
  • コピー処理だけで数十秒かかる

といった問題に遭遇することがあります。

特に実務では、

  • CSV取込
  • シート転記
  • 大量セル更新
  • フィルター処理
  • 帳票作成

などを自動化するケースが多く、
画面描画による負荷が処理速度へ大きく影響します。

このとき重要になるのが、
Application.ScreenUpdatingプロパティです。

ScreenUpdatingを適切に制御することで、
画面更新を一時停止し、
VBAの処理速度を大きく改善できる場合があります。

しかし一方で、

  • 停止したまま終了する
  • エラー時に戻らない
  • どの処理で使うべきかわからない

といった問題も非常に多いです。

この記事では、
Application.ScreenUpdatingプロパティの基本的な使い方から、
実務で重要な設計、
安全な復旧方法、
高速化の考え方まで詳しく解説します。

✅ Application.ScreenUpdatingプロパティとは何か

VBA初心者の方は、
「処理速度=コードの書き方」
だけを意識しがちです。

もちろん、

  • Selectを減らす
  • ループを最適化する
  • 配列を使う

なども重要ですが、
実務では「画面描画負荷」も大きなボトルネックになります。

Excelは通常、
セル選択・シート移動・コピー処理などが行われるたびに、
画面を更新しています。

つまり、
VBAで大量操作を行う場合、
裏側では画面描画処理も大量発生しています。

ScreenUpdatingは、
この画面更新を制御するためのプロパティです。

・ScreenUpdatingの基本動作

通常状態:

Application.ScreenUpdating = True

画面更新停止:

Application.ScreenUpdating = False

Falseに設定すると、
VBA実行中の画面更新が停止します。


・なぜ高速化につながるのか

たとえば、

  • シート移動
  • セル選択
  • コピー&ペースト

などを繰り返す場合、
Excelは毎回画面を書き換えています。

つまり、

  • セル変更
  • 描画更新
  • シート切替
  • 描画更新

を大量に繰り返しています。

ScreenUpdatingを停止すると、
この描画処理が抑制されるため、
VBA速度が改善しやすくなります。


✅ Application.ScreenUpdatingを停止する基本コード

ScreenUpdatingは、
VBA高速化で非常によく使われるプロパティです。

ただし、
単純にFalseへ変更するだけでは、
実務では危険なコードになりやすいです。

特に、
復旧忘れやエラー終了には注意が必要です。

ここでは、
まず基本的な使い方を確認していきましょう。

・画面更新を停止するコード

Sub StopScreenUpdating()

    Application.ScreenUpdating = False

    MsgBox "画面更新を停止しました"

End Sub

このコードを実行すると、
VBA処理中の画面更新が停止します。


・画面更新を再開するコード

Sub ResumeScreenUpdating()

    Application.ScreenUpdating = True

    MsgBox "画面更新を再開しました"

End Sub

実務では、
この「戻す処理」が極めて重要です。


・停止したまま終了するとどうなるか

ScreenUpdatingをFalseのまま終了すると、

  • 画面が更新されない
  • Excelが固まったように見える
  • 利用者が異常に気づかない

といった問題につながります。

そのため、
「高速化」よりも、
「必ず復旧する設計」の方が重要です。


✅ 実務で安全に使うための基本設計

ScreenUpdatingは便利ですが、
実務では「安全に戻す設計」が必須です。

特に、
途中エラー時の復旧漏れは非常に多いです。

つまり、
高速化テクニックというより、
「状態管理設計」として考えることが重要になります。

・実務向けの基本構造

Sub UpdateReport()

    On Error GoTo ErrorHandler

    ' 現在状態を保持
    Dim previousScreenUpdating As Boolean

    previousScreenUpdating = Application.ScreenUpdating

    ' 画面更新停止
    Application.ScreenUpdating = False

    ' -------------------------
    ' メイン処理
    ' -------------------------

    MsgBox "処理完了"

ExitPoint:

    ' 元へ戻す
    Application.ScreenUpdating = previousScreenUpdating

    Exit Sub

ErrorHandler:

    MsgBox "エラーが発生しました"

    Resume ExitPoint

End Sub

・なぜこの設計が重要なのか

この設計では、

  • 元設定保持
  • エラー時復旧
  • 他環境への影響防止

を実現できます。

特に実務では、
他マクロが特殊設定を使っているケースもあるため、
単純にTrue固定で戻す設計は危険な場合があります。

そのため、
「元の状態へ戻す」という考え方が重要になります。


✅ ScreenUpdatingで高速化しやすい処理とは

ScreenUpdatingは万能ではありません。

むしろ、
画面描画が少ない処理では、
ほとんど効果が出ない場合もあります。

つまり、
「どこで使うべきか」を理解することが重要です。

・特に効果が大きい処理

処理理由
シート切替描画更新が多い
コピー&ペースト表示変更が大量発生
セル選択処理ActiveCell移動が多い
オートフィル描画更新量が大きい
フィルター操作表示切替負荷が高い

・効果が小さい処理

処理理由
単純計算描画少ない
MsgBox中心処理シート変更なし
配列処理セル描画少ない

・Select多用コードほど効果が出やすい

たとえば以下のようなコード:

Range("A1").Select
Range("A2").Select
Range("A3").Select

これは、
選択のたびに画面描画が発生しています。

つまり、
ScreenUpdating停止効果が大きくなります。

ただし、
本来はSelect自体を減らす方が重要です。


✅ Calculationと組み合わせるとさらに高速化できる

実務では、
ScreenUpdating単体より、
Calculation停止と組み合わせるケースが非常に多いです。

なぜなら、
VBA速度低下の原因は、

  • 画面描画
  • 再計算

の両方であることが多いためです。

つまり、
片方だけ止めても、
もう片方が重ければ十分遅くなります。

・実務でよく使われる高速化構成

Sub SpeedUpProcess()

    On Error GoTo ErrorHandler

    Dim previousCalculationMode As XlCalculation
    Dim previousScreenUpdating As Boolean

    previousCalculationMode = Application.Calculation
    previousScreenUpdating = Application.ScreenUpdating

    ' 高速化設定
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    ' -------------------------
    ' メイン処理
    ' -------------------------

ExitPoint:

    ' 元へ戻す
    Application.ScreenUpdating = previousScreenUpdating
    Application.Calculation = previousCalculationMode

    Exit Sub

ErrorHandler:

    MsgBox "エラーが発生しました"

    Resume ExitPoint

End Sub

・なぜこの組み合わせが実務で強いのか

この構成では、

  • 描画停止
  • 再計算停止

を同時に行えます。

特に、

  • CSV取込
  • 集計更新
  • シート転記
  • 帳票作成

などでは、
大きな速度改善につながります。

ScreenUpdatingによる描画停止と並んで、
VBA高速化で非常に重要になるのが
「再計算の停止」です。

特に、
数式が大量に入ったブックでは、
セル更新のたびに再計算が発生し、
処理速度低下の大きな原因になります。

Application.Calculationプロパティを正しく理解しておくことで、
より実務的な高速化設計を行いやすくなります。

【VBA】Application.Calculationプロパティの使い方とその重要性


✅ ScreenUpdating使用時によくある失敗

ScreenUpdatingは便利ですが、
実務では誤用も非常に多いです。

特に、
「Falseにすれば速くなる」
だけで使うと危険です。

ここでは、
実務で多い失敗を確認しておきましょう。

・Trueへ戻し忘れる

最も多い失敗です。

結果として、

  • Excel画面が更新されない
  • フリーズに見える
  • 利用者が混乱する

といった問題につながります。


・エラー時に復旧しない

途中エラーで終了すると、
False状態のまま残るケースがあります。

そのため、
必ずエラー処理が必要です。


・速度改善効果を過信する

ScreenUpdatingは、
あくまで「描画停止」です。

つまり、
セルアクセスそのものが多い場合は、
配列化の方が効果が大きいケースもあります。


✅ VBA高速化をさらに進める実務テクニック

ScreenUpdatingだけでも改善できますが、
実務ではさらに複数の改善を組み合わせます。

特に重要なのは、

  • 配列処理
  • EnableEvents停止
  • Calculation停止
  • Select排除

などです。

高速化は、
単体テクニックではなく、
「全体設計」で考えることが重要です。

・EnableEvents停止も重要

イベント発火が多いブックでは、
イベント停止も有効です。

Application.EnableEvents = False

ただし、
こちらも復旧忘れには注意が必要です。


・配列化の方が効果が大きい場合もある

大量セル処理では、
画面更新停止より、
セルアクセス削減の方が効果的なケースもあります。

つまり、
「何が遅いのか」を見極めることが重要です。

ScreenUpdatingやCalculationの停止だけでも高速化できますが、
実務では「貼り付け処理そのもの」を見直すことも非常に重要です。

特に、
Copy・Pasteを大量に繰り返すコードでは、
値貼り付けの方法次第で処理速度が大きく変わることがあります。

VBAの高速化をさらに進めたい方は、
値貼り付けを効率化する実務テクニックもあわせて確認してみてください。

【VBA】値貼り付けを高速にする方法|処理速度を改善する実務テクニック


 

✅ まとめ:ScreenUpdatingはVBA高速化の基本テクニック

Application.ScreenUpdatingは、
Excel VBAの速度改善で非常によく使われるプロパティです。

特に、

  • シート切替
  • コピー処理
  • セル選択
  • 大量描画

では、
高い改善効果を期待できます。

ただし、
重要なのは単なる高速化ではなく、
「必ず復旧する安全設計」です。

・本記事のまとめ

項目内容
ScreenUpdating画面更新制御
False描画停止
True描画再開
最大注意点戻し忘れ
実務重要点元設定保持+エラー復旧

ScreenUpdatingを正しく使えるようになると、
VBAの実務処理速度は大きく改善できます。

単なる「おまじないコード」ではなく、
処理負荷を制御する実務設計として活用していきましょう。

    -VBAテクニック集, VBA一覧, 処理速度対策(VBA)