Excel VBAで大量データを処理していると、
- シート切り替え時に画面がチラつく
- セル選択が何度も表示される
- 処理自体は単純なのに異常に遅い
- コピー処理だけで数十秒かかる
といった問題に遭遇することがあります。
特に実務では、
- CSV取込
- シート転記
- 大量セル更新
- フィルター処理
- 帳票作成
などを自動化するケースが多く、
画面描画による負荷が処理速度へ大きく影響します。
このとき重要になるのが、
Application.ScreenUpdatingプロパティです。
ScreenUpdatingを適切に制御することで、
画面更新を一時停止し、
VBAの処理速度を大きく改善できる場合があります。
しかし一方で、
- 停止したまま終了する
- エラー時に戻らない
- どの処理で使うべきかわからない
といった問題も非常に多いです。
この記事では、
Application.ScreenUpdatingプロパティの基本的な使い方から、
実務で重要な設計、
安全な復旧方法、
高速化の考え方まで詳しく解説します。
目次
- ✅ Application.ScreenUpdatingプロパティとは何か
- ・ScreenUpdatingの基本動作
- ・なぜ高速化につながるのか
- ✅ Application.ScreenUpdatingを停止する基本コード
- ・画面更新を停止するコード
- ・画面更新を再開するコード
- ・停止したまま終了するとどうなるか
- ✅ 実務で安全に使うための基本設計
- ・実務向けの基本構造
- ・なぜこの設計が重要なのか
- ✅ ScreenUpdatingで高速化しやすい処理とは
- ・特に効果が大きい処理
- ・効果が小さい処理
- ・Select多用コードほど効果が出やすい
- ✅ Calculationと組み合わせるとさらに高速化できる
- ・実務でよく使われる高速化構成
- ・なぜこの組み合わせが実務で強いのか
- ✅ ScreenUpdating使用時によくある失敗
- ・Trueへ戻し忘れる
- ・エラー時に復旧しない
- ・速度改善効果を過信する
- ✅ VBA高速化をさらに進める実務テクニック
- ・EnableEvents停止も重要
- ・配列化の方が効果が大きい場合もある
- ✅ まとめ:ScreenUpdatingはVBA高速化の基本テクニック
- ・本記事のまとめ
✅ 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の実務処理速度は大きく改善できます。
単なる「おまじないコード」ではなく、
処理負荷を制御する実務設計として活用していきましょう。