「VBAの処理が遅くて困っている…」
そんな風に考えたことはありませんか?

・VBAをもっと高速化したい
・処理中の画面のちらつきが気になる
・Application.ScreenUpdatingでどれくらい早くなるの?



これらの問題を解決してくれるのが
VBAの「Application.ScreenUpdating」です!
この記事では、「Application.ScreenUpdating」を使ってVBAの処理速度を高速化する方法を、初心者でもわかりやすく解説します。
Application.ScreenUpdatingを活用すれば、画面更新を停止することで処理を効率化し、実際に動作が高速化します。
初心者でも理解できるサンプルコードを交え、わかりやすく解説しています。
この記事を読んで、エクセル作業をさらに効率的にしていきましょう!
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?
そんな方には、UdemyのVBA講座がおすすめです。
動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!


\ 自分のペースで学べるVBA講座はこちら /
この記事で「できるようになる」こと
この記事を読むことで、次のことが分かるようになります。
- VBAのApplication.ScreenUpdatingとは?を習得する
- Application.ScreenUpdating用を使用する際の注意ポイントを確認する
- Application.ScreenUpdatingを使用前後の処理時間を確認する
VBAのApplication.ScreenUpdatingとは? | 画面ちらつきを抑えてVBAを高速化
「Application.ScreenUpdating」は、Excel VBAで画面更新を制御するためのプロパティです。
通常、VBAコードを実行すると、処理中のセルの変化やスクロールが画面にリアルタイムで反映されます。
この画面更新がExcelに余計な負担をかけ、大量データ処理や複雑な計算時に動作が遅くなる原因となってしまいます。
解決策として、Application.ScreenUpdating = False
を設定すると、画面の更新を一時停止して処理を効率化できます。
処理が完了したらTrueに戻すことで、画面の更新を再開します。
これにより、画面のちらつきを抑えつつ、処理速度を大幅に向上させることが可能です。
Application.ScreenUpdatingを使うメリット
Application.ScreenUpdatingを使用することで、次のようなメリットがあります。
- 処理速度を大幅に高速化できる
- 画面更新を停止することで、Excelのリソース消費を抑え、大量データ処理や複雑な計算を効率化できます。
- 画面のちらつきを防ぎ、操作性を向上
- 処理中のセルやスクロールの変化が抑えられるため、視覚的にもスムーズで快適な操作が可能です。
- プロフェッショナルなマクロ作成が可能
- 見た目の変化を最小限に抑えることで、クライアント向けのマクロやプレゼン用ツールとしても質の高い印象を与えられます。
- 初心者でも簡単に導入できる
- 1行で画面更新を無効化・有効化できるため、特別な知識がなくても簡単にコードに組み込むことができます。
基本構文
以下のコードで、画面更新を無効化および有効化できます。
処理終了後に有効化 (True) にすることを忘れないようにしましょう。
画面更新を無効化した場合は、

より詳しい情報は、Microsoft公式のApplication.ScreenUpdating プロパティ (Excel)を参照してください。
使用例: 複数のシートを操作する場合
以下は、複数のシートを操作し、データを変更する際に使用するコード例です。
Sub MultiSheetUpdate()
'// 画面更新を無効化
Application.ScreenUpdating = False
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
ws.Cells(1, 1).Value = "Updated"
Next ws
'// 画面更新を有効化
Application.ScreenUpdating = True
End Sub
- 複数のシートを操作する場合、画面更新を停止することで処理をスムーズに実行可能です。
- このコードでは、すべてのシートの「A1」セルに「Updated」という値を入力します。
Application.ScreenUpdatingを使用する際の注意ポイント|間違った使い方を防ぐ方法
Application.ScreenUpdatingはVBAを高速化する上で非常に便利なプロパティですが、使い方を誤ると想定外の動作やパフォーマンス低下につながる場合があります。
以下の注意点をしっかり押さえて、効果的に活用しましょう。
注意ポイント1 : 必ずTrueに戻すこと
画面更新を停止した状態(Application.ScreenUpdating = False)のまま処理を終了すると、以下のような問題が発生します。
- Excelの画面が更新されず、操作性が損なわれる。
- 他のマクロを実行する際に、意図しない動作が発生する。
解決策
■ 処理終了時にTrueに戻す
Application.ScreenUpdating = False
'// 処理内容
Application.ScreenUpdating = True ' 処理終了後に必ずTrueに戻す
■ エラーが発生してもTrueに戻す工夫
エラー発生時でも画面更新を再開するように、エラーハンドリングを活用するのがおすすめです。
Sub SafeScreenUpdating()
On Error GoTo ErrorHandler '// エラー時の処理に移動
Application.ScreenUpdating = False
'// 処理内容を記載
For i = 1 To 10000
Cells(i, 1).Value = i
Next i
Application.ScreenUpdating = True '// 正常終了時
Exit Sub
ErrorHandler:
Application.ScreenUpdating = True '// エラー発生時もTrueに戻す
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub
注意ポイント2 : 誤った使用でパフォーマンスが低下することも
画面更新を頻繁に有効化・無効化するようなコードは、かえってパフォーマンスを低下させる場合があります。
非効率なコード例
以下のコードは、画面更新の設定を繰り返し行うため、非常に非効率です。
Sub InefficientScreenUpdating()
Dim i As Long
For i = 1 To 10000
Application.ScreenUpdating = False '// 画面更新を停止(繰り返しごとに設定)
Cells(i, 1).Value = i
Application.ScreenUpdating = True '// 画面更新を再開(繰り返しごとに設定)
Next i
End Sub
解決策:設定は必要最低限に留める
Application.ScreenUpdatingは、処理全体に対して1回だけ設定を行うのが基本です。
以下のように、処理前に1度だけ無効化し、処理終了後に有効化するように記述しましょう。
Sub EfficientScreenUpdating()
Dim i As Long
'// 処理全体で1度だけ画面更新を無効化
Application.ScreenUpdating = False
For i = 1 To 10000
Cells(i, 1).Value = i
Next i
'// 処理終了後に画面更新を有効化
Application.ScreenUpdating = True
End Sub
注意ポイント3 : 画面展開を伴わない処理場面では不適切
Application.ScreenUpdatingは、画面の更新を停止することで高速化を実現します。
しかし、以下のような場合には効果がほとんどありません。
- 画面の操作を伴わない処理(例: データの計算や文字列操作)
- 大規模なデータ処理で画面展開がそもそも発生しない場面
解決策
画面処理を行っていないのに動作が遅い場合、原因はセルの操作や再計算にある可能性が高いため、以下の方法を検討してください。
■ 配列を使って処理を高速化
配列を使用してセルデータを一括で操作することで、処理速度を向上させることができます。
Sub UseArrayForEfficiency()
Dim dataArray() As Variant
Dim i As Long
'// 配列にデータを格納
ReDim dataArray(1 To 10000, 1 To 1)
For i = 1 To 10000
dataArray(i, 1) = i
Next i
'// 配列を一括でシートに書き込む
Range("A1:A10000").Value = dataArray
End Sub
配列についての詳細については以下の記事で詳しく解説していますので、併せてご覧ください。
VBA 配列の使い方徹底解説:宣言、初期化、動的配列・ソートもわかる基本ガイド
■ 計算モードを変更して負荷を軽減
再計算の影響を抑えるため、Application.Calculationを併用するのがおすすめです。
Application.Calculation = xlCalculationManual '// 再計算を停止
'// 処理内容
Application.Calculation = xlCalculationAutomatic '// 再計算を再開
Application.ScreenUpdatingで処理速度を比較!実例コード付き
「Application.ScreenUpdating」を使用すると、処理速度がどれだけ速くなるのか確認してみましょう。
ここでは、Timer関数を使った時間計測モジュールを利用し、「画面更新を無効化した場合」と「無効化しなかった場合」の処理時間を比較します。
どちらがどれだけ速いか、実際のコードと計測結果を基に解説します。
また、Timer関数についての詳細や、時間計測モジュールの仕組みについては以下の記事で詳しく解説していますので、併せてご覧ください。
VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?
そんな方には、UdemyのVBA講座がおすすめです。
動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!


\ 自分のペースで学べるVBA講座はこちら /
時間計測を行う準備:Timer関数を活用した計測方法
まずは、Timer関数を活用して、処理時間を簡単に測定する仕組みを構築しましょう。
以下のコードを使うと、処理の開始時刻と終了時刻を記録し、経過時間を自動で計算できます。
- 新しい標準モジュールを作成しましょう。
標準モジュールの準備方法を見る - この標準モジュールに処理コードをコピペしてください。
コピペする処理コードを見る
時間計測モジュールの完成形コード
以下のコードを新しい標準モジュール(例:Module2
)にコピーして利用します。
専用の標準モジュールを作成しておくと、他のコードと分けて管理できるので便利です。
■ コードの記載場所


標準モジュールの作成方法・名前の変更方法について知りたい方は、下記をクリックしてください。
クリックして標準モジュールの追加方法を見る
- 「開発タブ」をクリックします。
- 「Visual Basic」をクリックし、VBAエディタを開きます。
※「Alt + Basic」を押しても問題ありません。


- 左の空白部で「右クリック」を行います。
- 開いたメニューから「挿入 (N)」を選択します。
- その中の「標準モジュール (M)」をクリックすることで、新規で標準モジュールを作成することができます。


- 「プロパティ – Module~」に記載されている「(オブジェクト名)」を変更したら、標準モジュール名を変更することができます。


処理コード
このコードをそのまま標準モジュールにコピペしてください。
Option Explicit
'// 計測を有効にするフラグ(Trueで計測有効、Falseで無効)
Public Const ENABLE_TIMING As Boolean = True
'// 開始時刻を記録する変数
Private startTime As Double
'// 計測開始関数
Public Sub StartTimer()
If ENABLE_TIMING Then
startTime = Timer
End If
End Sub
'// 計測終了関数
Public Sub EndTimer(taskName As String)
If ENABLE_TIMING Then
Dim elapsed As Double
elapsed = Timer - startTime
Debug.Print taskName & " の処理時間: " & elapsed & " 秒"
End If
End Sub


実際に処理時間を測定! : シート間データ転記で比較
次に、画面更新の有無で処理速度がどれだけ変わるかをテストします。
以下は、シート間で列の偶数を非表示にする処理を行い、その処理時間を計測するコードです。
- Excelファイルには「Sheet1」という名前のシートを作成してください。
- そのシートには、列が複数含まれている状態である必要があります(デフォルトの状態でOK)。
テストコード例
Sub CompareScreenUpdatingPerformance()
Dim elapsedTime(2) As Double ' 処理時間を格納する配列
Dim c As Range
Dim i As Long
'// 1回目: 画面更新を有効にした場合
Application.ScreenUpdating = True
StartTimer
Worksheets("Sheet1").Activate
For Each c In ActiveSheet.Columns
If c.Column Mod 2 = 0 Then c.Hidden = True
Next c
EndTimer "画面更新を有効にした場合"
elapsedTime(1) = Timer
'// リセット: 列の非表示を解除
For Each c In ActiveSheet.Columns
c.Hidden = False
Next c
'// 2回目: 画面更新を無効化した場合
Application.ScreenUpdating = False
StartTimer
Worksheets("Sheet1").Activate
For Each c In ActiveSheet.Columns
If c.Column Mod 2 = 0 Then c.Hidden = True
Next c
EndTimer "画面更新を無効化した場合"
elapsedTime(2) = Timer
'// リセット: 列の非表示を解除
For Each c In ActiveSheet.Columns
c.Hidden = False
Next c
'// 必ず画面更新を再有効化
Application.ScreenUpdating = True
End Sub
実行結果:処理時間の比較
コードを実行すると、イミディエイトウィンドウに以下のような結果が出力されます(実行環境やデータ量によって異なります)。


なぜこれほどの差が出るのか?仕組みを解説
- 画面更新を有効にした場合
- 処理が進むたびに画面がリアルタイムで描画されます。
- この描画処理がExcelに負担をかけ、全体の処理速度が低下します。
- 画面更新を無効にした場合
- 処理中の画面描画が停止するため、Excelが無駄なリソースを消費せずに済みます。
- その結果、処理速度が大幅に向上します。
この記事のまとめ
この記事では、VBAのApplication.ScreenUpdatingを活用して処理速度を高速化する方法について、基礎から実践まで詳しく解説しました。
重要なポイントを以下に整理しましたので、復習にお役立てください!
ポイントのおさらい
- Application.ScreenUpdatingの基本を理解する
- Application.ScreenUpdatingは、VBAの画面更新を制御するプロパティです。
- 画面更新を無効化(
False
)することで、処理速度が大幅に向上します。
⇒ 「VBAのApplication.ScreenUpdatingとは? | 画面ちらつきを解消しよう」をもう一度見る
- Application.ScreenUpdatingを使うメリット
- 処理速度を大幅に高速化できる。
- 画面のちらつきを防ぎ、操作性が向上する。
- 初心者でも簡単に導入可能で、プロフェッショナルなマクロを作成可能。
⇒ 「Application.ScreenUpdatingを使うメリット」をもう一度見る
- 3. 使用時の注意ポイント
- 処理終了後に必ず
True
に戻す。 - 不適切な使用でかえってパフォーマンスが低下する可能性がある。
- 画面展開を伴わない処理では効果が薄い場合もある。
⇒ 「Application.ScreenUpdatingを使用する際の注意ポイント」をもう一度見る
- 処理終了後に必ず
- 実際の処理速度を比較して理解を深める
- Timer関数を活用して、「画面更新を無効化した場合」と「無効化しなかった場合」の処理速度を比較しました。
- 実行結果を基に、どれだけ効率化できるかを確認できます。
⇒ 「Application.ScreenUpdatingの効果を測定!処理時間を比較してみよう」をもう一度見る
さらに学ぶために
Application.ScreenUpdatingの知識を活用することで、VBAの処理を効率化し、業務の生産性を向上させることができます。
ぜひ、今回の記事で紹介した方法を実際のマクロ作成に活用してみてください!

