1. はじめに
Excel VBAにおけるApplication.ScreenUpdating
プロパティは、マクロ実行時に Excelの画面の描画(更新)を制御するための重要な設定です。
通常、Excelではセルの値や書式が変更されるたびに画面が更新されますが、大量のセルを変更したり複雑な処理を行う際に毎回画面が再描画されると、処理速度が著しく低下します。
ScreenUpdating
をうまく使うことで、 画面描画を一時的に停止し、マクロの処理速度を飛躍的に向上させることが可能です。
2. Application.ScreenUpdating の基本
2-1. プロパティの型と初期値
- 型: Boolean
- 初期値(既定値):
True
(画面の更新は有効)
2-2. 設定方法
Application.ScreenUpdating = False ' 画面の描画を停止(非表示)
Application.ScreenUpdating = True ' 画面の描画を再開(表示)
3. ScreenUpdatingの効果とメリット
3-1. 処理速度の向上
- Excelはセルやシートの変更時に画面の再描画を行います。これが頻繁に起こると、処理時間が大幅に延びます。
ScreenUpdating = False
にすると、Excelは画面を更新しなくなり、マクロの処理に専念します。- 処理終了後に
ScreenUpdating = True
に戻すと、一気に画面が更新されるため、処理速度が飛躍的に向上します。
3-2. 画面のちらつき防止
- 画面が頻繁に更新されると、ユーザーは画面がチラついて見え、操作感が悪くなります。
- 更新停止により、マクロ処理中は画面のちらつきを防止できます。
3-3. 処理中の視覚的な安定感
- 画面が一切変わらないため、ユーザーに「処理中」という印象を与えやすく、操作ミスや中断を防止できます。
4. 実践的な使い方
4-1. 基本例
Sub 大量データ処理()
Application.ScreenUpdating = False
Dim i As Long
For i = 1 To 10000
Cells(i, 1).Value = i
Next i
Application.ScreenUpdating = True
End Sub
- このコードでは10000回セルに値を書き込みますが、
ScreenUpdating
をFalse
にしているので、画面更新は1回だけになり高速に動作します。
4-2. エラー処理付きの安全な書き方
Sub 安全なScreenUpdating()
On Error GoTo エラー処理
Application.ScreenUpdating = False
' --- 処理内容 ---
Cells(1, 1).Value = "テスト"
Application.ScreenUpdating = True
Exit Sub
エラー処理:
Application.ScreenUpdating = True
MsgBox "エラーが発生しました: " & Err.Description
End Sub
- マクロが途中でエラーで停止しても、必ず画面更新を元に戻すようにします。
- これを怠ると、画面が更新されずユーザーが操作不能になったように感じるため重要です。
5. 画面更新停止中の注意点
5-1. ユーザーへの処理状況表示ができない
- 画面の更新を停止している間は、セルの値やフォント変更などが画面に反映されないため、ユーザーは進捗状況がわかりません。
- 大量処理では「何も動かない…」と感じさせてしまうため、別途ステータスバー表示やユーザーフォームを使って進捗を示す工夫が必要です。
5-2. 処理中に画面が固まったように見える
- 長時間の処理では画面が変わらないため、誤ってExcelがフリーズしたと思われることがあります。
DoEvents
を適切に使い、画面の反応を保つ工夫が推奨されます。
5-3. マクロ終了時に元に戻すこと
ScreenUpdating
をFalse
にしたままマクロが終了すると、画面更新が停止したままになり、ユーザーが混乱します。- マクロ終了時に必ず
True
に戻すようにコードを書くことは必須です。
6. 他の設定との組み合わせで効果UP
6-1. Application.EnableEvents(イベントの有効/無効)
- マクロ中のイベント発火を抑制し、処理の暴走や重複処理を防ぐ。
6-2. Application.Calculation(計算モード切替)
- 再計算を手動にすることで、計算処理を最小限に抑える。
6-3. 組み合わせ例
Sub 高速処理テンプレート()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
' --- 大量処理 ---
With Application
.Calculation = xlCalculationAutomatic
.EnableEvents = True
.ScreenUpdating = True
End With
End Sub
- これにより、マクロ実行中の画面更新、イベント、計算をすべて抑え、効率的に処理ができます。
7. 画面更新を使った応用例
7-1. ステータスバーとの連携
Application.StatusBar
で処理状況を表示し、画面更新停止中でもユーザーに進捗を伝えることが可能。
7-2. プログレスバー表示
- 文字を使った疑似プログレスバーをステータスバーに表示し、処理進捗をリアルタイムに報告。
8. 実際のケーススタディ
ケース1:大量データの書き込み
- 10000セルにデータを書き込む処理。
Without ScreenUpdating=False
- 1セル書き込みごとに画面が更新されるため非常に遅い。
With ScreenUpdating=False
- 画面は処理終了まで更新されないため、一気に高速化。
ケース2:複数シートの一括処理
- 複数のシートでデータ加工を行う際、
ScreenUpdating=False
にして画面のフラッシュやちらつきを防ぐ。
9. まとめ
項目 | 内容 |
---|---|
プロパティ名 | Application.ScreenUpdating |
型 | Boolean (True /False ) |
目的 | 画面の再描画を停止・再開して処理速度を最適化 |
初期値 | True (画面更新あり) |
利点 | マクロ処理の高速化、画面のちらつき防止 |
注意点 | マクロ終了時に必ず True に戻す |
他の設定 | EnableEvents や Calculation と組み合わせると効果的 |
10. 付録:トラブルシューティング
Q1. マクロ終了後に画面が更新されない!
- 原因:
ScreenUpdating = False
のまま終了した。 - 対処:VBAエディタで即時ウィンドウ(Ctrl + G)を開き、
Application.ScreenUpdating = True
と入力して実行する。
Q2. 画面が更新されず処理が固まっているように見える
DoEvents
を使い適宜画面の反応を保つ。
DoEvents