Excel VBAで画面更新を停止する方法をお探しですね。

広告

Excel VBAを高速化!Application.ScreenUpdatingの使い方

Excel VBAでマクロを作って実行したとき、画面がパタパタ切り替わったり、セルの選択がバタバタ動いたりして「なんか遅いな…」と感じたことはありませんか?

そんなときに役立つのが、**Application.ScreenUpdating**という設定です。

これを使うと、マクロ実行中の画面更新を一時的に止めることができて、処理が速くなることがあります。

ただし、これは「書けば何でも速くなる魔法の呪文」というわけではありません。

効果が出やすい処理と、そうでもない処理があるんです。

この記事では、ScreenUpdatingの基本的な使い方から、注意すべきポイント、さらに一歩進んだ高速化のコツまで、わかりやすく解説していきます。

Application.ScreenUpdatingって何?

**Application.ScreenUpdating**は、VBAを実行している間、Excelの画面表示を更新するかどうかを切り替える設定です。

普通、Excelはマクロの動きに合わせて、セルを選んだり、シートを移動したり、コピーしたりする様子を画面にリアルタイムで表示します。

でも実は、この画面描画って意外と時間がかかるんです。

特に、たくさんのセルを処理したり、複数のシートを行ったり来たりするマクロだと、画面を表示する時間だけでかなり遅くなってしまうことがあります。

使い方はとってもシンプル。

処理を始める前に**Application.ScreenUpdating = False**と書いて画面更新を止めて、処理が終わったら**Application.ScreenUpdating = True**で元に戻すだけです。

基本の形はこんな感じです。

“`vb
Sub Sample()
Application.ScreenUpdating = False

‘ここにやりたい処理を書く

Application.ScreenUpdating = True
End Sub
“`

この設定を入れると、マクロ実行中にシートがパタパタ切り替わったり、セル選択がバタバタ移動したりする様子が見えなくなります。

その分、Excelが画面を描き直す時間を節約できるので、処理全体が速くなるというわけです。

特に、「マクロの記録」機能で作ったコードには`Select`や`Selection`がたくさん含まれていて、画面が頻繁に切り替わりやすいので、ScreenUpdatingの効果を実感しやすいと思います。

ただし、ScreenUpdatingはあくまで「画面の表示更新を止める」だけの機能です。

計算そのものを速くしたり、無駄なループを減らしたりする機能ではありません。

だから、もともと画面があまり動かない効率的なコードでは、設定してもあまり速度が変わらないこともあります。

ScreenUpdatingは「画面描画の負担を減らすための設定」として使うのがポイントです。

基本的な使い方と安全な書き方

ScreenUpdatingを使うときに一番大事なのは、**処理の最後で必ずTrueに戻すこと**です。

Falseのまま終わってしまうと、Excelの画面が更新されなくなって、ユーザーから見ると「画面が固まった?」みたいに感じられることがあります。

マクロが正常に終わる場合は最後にTrueを書けばOKですが、途中でエラーが起きたときにも元に戻るようにしておくと安心です。

実務で使うなら、エラー処理を入れたこんな形がおすすめです。

“`vb
Sub SafeSample()
On Error GoTo ErrorHandler

Application.ScreenUpdating = False

‘ここにやりたい処理を書く

ExitHandler:
Application.ScreenUpdating = True
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description
Resume ExitHandler
End Sub
“`

このコードなら、処理中にエラーが起きても、最後にちゃんと画面更新を再開してから終了できます。

他の人が使うマクロや、毎日使う業務ファイルのマクロでは、こういう安全な書き方にしておくのがベストです。

それから、ScreenUpdatingを使う場所にも気をつけましょう。

処理の途中で何度もFalseとTrueを切り替えると、そのたびに画面更新が起きて、かえって遅くなることがあります。

基本的には、マクロの最初でFalse、最後でTrueにするのが自然です。

ただし、進捗状況をユーザーに見せたい場合や、途中でフォームを表示する場合などは、一時的に画面更新を戻す工夫が必要になることもあります。

速くなる処理・あまり変わらない処理

ScreenUpdatingの効果が大きいのは、**画面が頻繁に切り替わる処理**です。

例えば:
– マクロの記録で作ったコードのように、毎回セルを`Select`してから値を書き込む処理
– シートを切り替えながらコピー&ペーストを繰り返す処理
– たくさんのセルに書式を設定する処理
– 複数のシートを順番に操作する処理

こういう処理では、画面更新を止めることで速度改善が期待できます。

逆に、もともと画面の切り替えが少ないコードでは、ScreenUpdatingだけで劇的に速くなるとは限りません。

対象のセルやシートを直接指定して処理しているコードなら、画面描画の負担が少ないので、ScreenUpdatingの有無による差は小さくなります。

「画面更新を止めたのに速くならない」と感じたら、原因はScreenUpdatingではなく、処理の書き方そのものにあるかもしれません。

特に見直したいのが、**`Select`や`Selection`を使いすぎていないか**という点です。

手作業では、セルを選択してからコピーや入力を行いますが、VBAでは対象を直接指定できます。

例えば、こんな書き方は画面更新が発生しやすく、処理も遠回りです。

“`vb
Range(“A1”).Select
Selection.Value = “完了”
“`

これを、こう書けばセルを選択する必要がありません。

“`vb
Range(“A1”).Value = “完了”
“`

ScreenUpdatingは、非効率なコードをある程度カバーしてくれることがあります。

でも、本当の意味で速くしたいなら、画面更新を止めるだけじゃなくて、**そもそも画面を動かさないコードにする**ことが大切です。

ScreenUpdatingによる画面更新の停止は基本として有効ですが、それに頼るだけじゃなくて、`Select`を減らす、セル範囲をまとめて処理する、配列を使うといった改善と組み合わせることで、もっと安定した高速化につながります。

さらに速くするために併用したい設定

ScreenUpdatingと一緒に覚えておくと便利なのが、**計算モード**や**イベント**、**警告表示**の制御です。

Excelファイルにたくさんの数式が入っている場合、VBAでセルの値を書き換えるたびに再計算が走って、処理が遅くなることがあります。

こういうときは、画面更新を止めるだけじゃなくて、**計算モードを一時的に手動にする**と、さらに速度が改善されます。

ただし、計算モードはExcel全体に影響する設定なので、処理前の状態を変数に保存して、最後に元に戻す書き方が安全です。

“`vb
Sub FastProcess()
Dim oldCalc As XlCalculation

On Error GoTo ErrorHandler

oldCalc = Application.Calculation

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

‘ここにやりたい処理を書く

ExitHandler:
Application.Calculation = oldCalc
Application.EnableEvents = True
Application.ScreenUpdating = True
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description
Resume ExitHandler
End Sub
“`

**Application.Calculation = xlCalculationManual**は、自動計算を一時的に止める設定です。

処理中に最新の計算結果が必要な場合は、必要なタイミングで`Application.Calculate`を実行すればOKです。

**Application.EnableEvents = False**は、セル変更時などに発生するイベント処理を一時的に止める設定です。

イベントマクロが入っているブックでは、VBAでセルを書き換えるたびに別の処理が動いてしまうことがあるので、意図しない遅延や二重実行を防ぐために使います。

注意したいのは、**これらの設定をむやみに全部入れればいいわけじゃない**ということです。

例えば、`DisplayAlerts`をFalseにすると、シート削除時の確認メッセージなどが表示されなくなって便利ですが、確認なしで処理が進むので、誤操作に気づきにくくなります。

`Interactive`をFalseにするとキーボードやマウス操作を受け付けなくできますが、戻し忘れるとExcelの操作に支障が出ます。

高速化設定は便利なほど影響範囲も広いので、「何を止めているのか」を理解して使うことが大切です。

進捗表示も忘れずに

画面更新を停止すると、処理が進んでいるかユーザーに見えにくくなる点にも配慮が必要です。

短時間で終わるマクロなら問題ありませんが、数十秒以上かかる処理では、**ステータスバーに進捗を表示する**と安心感が高まります。

例えば`Application.StatusBar = “処理中です…”`のように表示して、終了時に`Application.StatusBar = False`で元に戻します。

長い処理の途中で画面表示を更新したい場合は`DoEvents`を適度に使う方法もありますが、入れすぎると処理速度が落ちることがあるので、進捗表示が必要な場面に絞るのが現実的です。

まとめ

Excel VBAの処理を高速化するうえで、**Application.ScreenUpdating**による画面更新停止は、最初に覚えたい基本テクニックです。

特に、シート移動やセル選択が多いマクロでは効果を実感しやすく、処理中のちらつきも抑えられます。

ただし、根本的な高速化には、次のような見直しも欠かせません。

– `Select`を減らす
– セル操作をまとめる
– 不要な再計算やイベントを止める

ScreenUpdatingを正しく使って、最後に必ず元へ戻す安全な書き方を身につければ、日常業務で使うVBAマクロをより速く、安定して動かせるようになります。

まずは基本から試してみて、少しずつ自分のマクロを改善していきましょう!

広告