VBA高速化の秘訣!Application.ScreenUpdatingの使い方と処理時間を比較

当ページのリンクには広告 (Amazonアソシエイト含む) が含まれています。
アイキャッチ

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


VBAをもっと高速化したい

処理中の画面のちらつきが気になる

・Application.ScreenUpdatingでどれくらい早くなるの?

これらの問題を解決してくれるのが
VBAの「Application.ScreenUpdating」です!


この記事では、「Application.ScreenUpdating」を使ってVBAの処理速度を高速化する方法を、初心者でもわかりやすく解説します。

Application.ScreenUpdatingを活用すれば、画面更新を停止することで処理を効率化し、実際に動作が高速化します。

初心者でも理解できるサンプルコードを交え、わかりやすく解説しています。
この記事を読んで、エクセル作業をさらに効率的にしていきましょう!


【 この記事の概要 】

よく使う度
難しさ
覚えておくと安心度

VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?

そんな方には、UdemyのVBA講座がおすすめです。

動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べるVBA講座はこちら  /

目次

この記事で「できるようになる」こと

この記事を読むことで、次のことが分かるようになります。

スポンサーリンク

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講座がおすすめです。

動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べる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の知識を活用することで、VBAの処理を効率化し、業務の生産性を向上させることができます。

ぜひ、今回の記事で紹介した方法を実際のマクロ作成に活用してみてください!

あわせて読みたい
サイトマップ このページは、本サイトの記事を分かりやすくまとめました。ぜひご覧ください。 目次 「VBA」を見る 「Officeスクリプト」を見る 「ワークシート関数」を見る 「JavaScr...
スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次