TL;DR —
Application.ScreenUpdating = Falseは、マクロの実行中は画面の再描画を止めて、 最後に一度だけ描き直すよう Excel に指示します。これでちらつきが消え、ほどよく速くなります — ただしコードがセルへ書き込む、選択する、スクロールするときだけです。再計算やファイル I/O の せいで遅いマクロには何の効果もありません。終わったらTrueに戻し、自動で戻ることを決して 当てにしないでください — クラッシュすると画面がフリーズして灰色のまま固まりかねません。
Sub PaintRows()
Application.ScreenUpdating = False ' 再描画を止める - もうちらつかない
On Error GoTo CleanExit ' クラッシュしても画面を置き去りにしないように
Dim i As Long
For i = 2 To 5000
Cells(i, 1).Interior.Color = IIf(i Mod 2 = 0, RGB(240, 240, 240), vbWhite)
Next i
CleanExit:
Application.ScreenUpdating = True ' エラーのあとでも必ず戻す
End Sub
マクロがセルを変えるたびに、Excel はそれを表示しようと画面を描き直そうとします。それを 5,000 回
やれば、ユーザーが見る必要のなかった 5,000 回の再描画の代金を払うことになります。
ScreenUpdating = False は、それらを最後のたった一度の再描画にまとめます。本記事は 1 つの
考えを軸にしています — ScreenUpdating は再描画のスイッチであって、魔法の高速化スイッチではない。
取り除くのは再描画の仕事、それだけだ。 これを理解すれば、いつ効くのか、いつ一行の無駄になるのか、
そしてなぜクラッシュ後に切ったまま残すのが本当の危険なのかが、正確に分かります。
この記事で学べること
- 考え方の軸 — Excel は変更のたびに再描画する。このスイッチは再描画を一度にまとめる
- 実際に効く場面 — 書き込み・選択・スクロール — と、何もしない場面
- 最も大事なルール — クラッシュは画面を置き去りにしうる。だからエラーハンドラーの中で戻す
- 入れ子の復元によるちらつきの罠 — 切ったはずなのに画面がまだちらつく理由
- Calculation と EnableEvents との組み合わせ方
ScreenUpdatingとDisplayStatusBar、その他の見た目のスイッチ
考え方の軸:Excel は変更のたびに再描画する
既定では、Excel は画面をブックとリアルタイムで同期させ続けます。マクロが A1 を設定すれば Excel は
再描画し、A2 を設定すればまた再描画します。一回一回の再描画はそれ自体は安いのですが、何千もの
セルに触れるループの中では再描画が支配的になり — マクロがシートを走り書きしていくにつれて、画面が
激しくちらつくのが見えます。
Application.ScreenUpdating = False は、それを一時停止します。Excel はメモリ上でブックを更新し
続けますが、それを描くのをやめます。プロパティを True に戻す(またはマクロが終わる)と、Excel は
一度だけ再描画し、完成した結果が一回のきれいな飛躍で現れます。ユーザーが見るのは「前」と「後」だけ
で、その間のちらつきは決して見ません。
Application.ScreenUpdating = False ' Excel は描画をやめる(作業は続けている)
' ... 何千ものセルへの書き込みが目に見えず進む ...
Application.ScreenUpdating = True ' 一度の再描画で最終状態を表示
実際に効く場面 — そして何もしない場面
ここは多くのチュートリアルが飛ばすところで、そして肝心要です。ScreenUpdating が取り除くのは
再描画の仕事です。マクロが別の理由で遅いなら、これを切っても何も変わりません。
コードが次のことをするときは大いに効きます。
- ループで多くのセルへ書き込む
.Select/.Activateを使う(選択のたびに再描画される)- スクロールする、あるいは画面に見えるものを変える
次の理由でマクロが遅いときは何もしません。
- 書き込みごとの重い再計算 — それは Calculation の担当
- ファイルの読み書き、データベースへの問い合わせ、Web サービスの呼び出し
- 配列や変数に対する純粋なメモリ内の処理(再描画するものが何もない)
ですから、ScreenUpdating = False を足してもマクロがまだ遅いなら、間違ったスイッチに手を伸ばした
のです。実務で最も大きな高速化は、たいていこれではまったくありません — それはセル単位のループを、
一度の配列読み込みと一度の配列書き込みに置き換えることで、これが再描画とセルごとのオーバー
ヘッドを一挙に取り除きます。ScreenUpdating は、その上に載る仕上げであって、それ自体が解決策では
ありません。
最も大事なルール:クラッシュは画面を置き去りにする
誰もがはまる失敗がこれです。ScreenUpdating = False を設定し、マクロが途中でエラーになり、実行が
止まる — それを戻す行の手前で。Excel はいま画面更新が無効のまま座り込んでいます。ウィンドウは
フリーズしたように、半分だけ描かれたように、あるいはただ灰色に見え、ダイアログボックスの残像が
居座ります。ユーザーはクラッシュしたと思って Excel を強制終了しますが、実際に起きたのはスイッチが
切られたまま残っただけです。
マクロが終わると Excel が ScreenUpdating を自動で True に戻す、と読むことがあるでしょう。戻す
こともあります — けれど「ときどき」を前提に設計はできません。マクロがきれいに終わるのではなく
エラーになるとき、あるいはブレークモードで一行ずつ実行しているときは、画面は固まったままです。
Microsoft 自身の案内も、自分で True に戻すこと、です。だからルールは単純です。エラーハンドラーの
中で戻す。そうすれば、マクロが成功しようが吹き飛ぼうが走る。
Sub SafeRepaint()
Application.ScreenUpdating = False
On Error GoTo CleanExit
' ... エラーを起こしうる処理 ...
Cells(1, 1).Value = 1 / 0 ' 爆発
CleanExit:
Application.ScreenUpdating = True ' 上のエラーのあとでもこれは走る
If Err.Number <> 0 Then MsgBox Err.Description
End Sub
On Error GoTo CleanExit とラベルのパターンは、このクラスター全体が共有するのと同じ心得です —
VBA On Error を参照。これがなければ、処理されないエラー一つが、速度の
最適化をサポート問い合わせに変えてしまいます。
入れ子の復元によるちらつきの罠
もっと分かりにくいバグ:ScreenUpdating を切ったのに、画面がまだちらつく。よくある原因は、
呼び出した Sub がそれを True に戻していることです。
Sub Outer()
Application.ScreenUpdating = False
FormatBlock ' この Sub が再びオンにする - ここから再描画が復活
WriteTotals ' 更新が再びオンなのでちらつく
Application.ScreenUpdating = True
End Sub
Sub FormatBlock()
Application.ScreenUpdating = False
' ... 書式設定 ...
Application.ScreenUpdating = True ' <-- 犯人:呼び出し元の分まで再び有効にしてしまう
End Sub
ScreenUpdating は単一のグローバル設定で、スタックではありません。FormatBlock がそれを True に
戻すと、Outer にとっても True になり、その呼び出し以降のあらゆる書き込みが再描画されます。
直し方は、最上位のマクロにスイッチを持たせ、補助の Sub には手を触れさせないこと — あるいは、
各補助 Sub が True を決め打ちするのではなく、見つけた値を保存して復元することです。この「元が
どうだったかを保存し、元どおりに戻す」という同じ習慣が、Calculation を
安全に保つのと同じものです。
ScreenUpdating とその他の見た目のスイッチ
ScreenUpdating には物静かな親戚がいます。Application.DisplayStatusBar = False と
Application.Calculation = xlCalculationManual は速度のためにまとめて設定されることが多く、
Application.EnableEvents = False は正しさのためです。ただし、どれが何をするのかははっきりさせて
おきましょう。ScreenUpdating は純粋に見た目のためで、忘れても安い — 最悪でも、再起動で直る
フリーズしたように見えるウィンドウどまりです。Calculation を切ったまま
残すと静かに間違った数字が残り、EnableEvents を切ったまま残すと
ブックのイベントが死んだままになります。コード上は似て見えます — 冒頭に並ぶ 3 つの = False
行 — が、それぞれを忘れたときの代償はまるで違います。3 つとも「必ず戻すもの」として扱い、そのうえ
で賭け金がなぜ違うのかを知っておきましょう。
ExcelMaster の活用
ScreenUpdating は一行ですが、うまく使うということは、いつ効くのか(画面に縛られたループ)、いつ
無駄になるのか(計算や I/O に縛られた処理)を知り、そしてクラッシュがディスプレイを置き去りに
しないよう、つねにエラーハンドラーの中で戻すことを意味します。一つのプロパティにしては、驚くほど
の判断量です。
ExcelMaster は、既定で
速いほうを書きます。「5,000 行にわたって一行おきに色を塗って」と頼めば、処理をまとめ、
ScreenUpdating(そして Calculation、イベントが絡むときは EnableEvents も)を CleanExit の
復元で包み、マクロが画面に縛られていないときはスイッチを丸ごと省きます。どのレバーがどの種類の
遅さを直すのかを覚えなくても、高速化と安全の両方が手に入ります。
よくある質問
VBA の Application.ScreenUpdating = False は何をしますか?
マクロの実行中、画面の再描画をやめるよう Excel に指示します。Excel はメモリ上でブックを更新し
続けますが、その変更を描かないので、目に見えるちらつきと再描画ごとのコストが取り除かれます。再び
ScreenUpdating = True にすると、Excel は一度だけ再描画し、最終結果が一回の飛躍で現れます。
ScreenUpdating = False にしてもマクロがまだ遅いのはなぜですか?
ScreenUpdating が取り除くのは画面の再描画の仕事だけだからです。マクロが再計算、ファイルや
データベースの I/O、あるいはセルごとのループのオーバーヘッドのせいで遅いなら、再描画を無効にしても
何も変わりません。計算の重いマクロには Application.Calculation = xlCalculationManual を設定し、
最大の効果を得るにはセル単位のループを一度の配列読み書きに置き換えましょう。
ScreenUpdating を True に戻さなければなりませんか?
はい — 明示的に戻してください。マクロがきれいに終わるときは Excel が戻すこともありますが、処理され
ないエラーを発生させたときやブレークモードで止めたときは戻さず、画面がフリーズしたり灰色になったり
しかねません。エラーハンドラーの中で戻し(On Error GoTo CleanExit とラベルの中の
Application.ScreenUpdating = True)、マクロが成功しても失敗しても走るようにしましょう。
ScreenUpdating を切ったのに画面がまだちらつくのはなぜですか?
たいていは、呼び出した Sub が戻る前に ScreenUpdating = True を設定しているからです。これは単一の
グローバル設定なので、再び有効にする補助 Sub は呼び出し元の分まで有効にしてしまい、その呼び出し
以降のあらゆる書き込みが再描画されます。最上位のマクロにスイッチを持たせ、補助 Sub には手を触れ
させないか、見つけた値を保存して復元させましょう。
ScreenUpdating、Calculation、EnableEvents の違いは何ですか?
3 つとも、マクロを速く、あるいは安全にするために切る Application のスイッチですが、制御するものは
それぞれ違います。ScreenUpdating は画面の再描画を止めます(見た目の話で、忘れても安い)。
Calculation は数式の再計算を止めます(切ったまま残すと古い数字が
表示される)。EnableEvents はイベントハンドラーの発火を止めます(切った
まま残すと、Excel を再起動するまでブックのイベントが壊れる)。
検証環境
検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-08-17。
関連ガイド: VBA Calculation · VBA EnableEvents · VBA On Error · VBA Range · VBA WorksheetFunction
