【Excel VBA】【高速化】画面描画の停止で高速化

りゅう
こんにちは!りゅう(@ryupong_b)です。
今回は、高速化のテクニック「画面描画の停止」について解説していきます。
はじめに

「自分が作ったマクロが遅い…」こういった経験ありますよね。
VBAの高速化の第一歩として、画面描画の停止があります。

VBAでは、セルの値を入力したり、コピーしたり、行を挿入、削除したりします。
上記操作を実行すると、Excel上でアニメーション描画されており無駄なリソースを使ってしまってマクロ自体が遅くなるのです。
今回は、画面描画を停止する方法をご紹介します。

この記事を読むメリット
  • ExcelVBAの基礎である画面描画の重要性について解説します。
  • 画面描画の注意点についても解説します。

構文

画面描画を停止する方法は以下の通りです。

構文

Application.ScreenUpdating = False

逆に、描画を再開するときには以下を実行してください。

構文

Application.ScreenUpdating = True

ソースコードの終わりに、必ず画面描画をONにしてください。
描画をONにしないと、マクロが終了した際にExcelがフリーズしたような挙動になります。

期待効果について

画面描画を停止すると、どれほど早くなるのかを実験してみました!

検証の前提

本テクニックで一番効果が出るのが、「画面描画されるアクション」です。
今回の検証では、シートを1000枚作成するソースコードで検証してみました。

めい
シート追加のときには、画面が切り替わったり、画面にかなり影響があるもんね

結論として、検証結果は以下となりました。

画面描画あり(テクニックを使用しない)の場合

サンプルコード

サンプルコード


Option Explicit

Public Sub testScreenUpdate()

    Debug.Print "-- 画面描画あり --"

    Debug.Print Now

    Dim i As Long
    ' シートを1000枚作成する
    For i = 1 To 1000

        ThisWorkbook.Worksheets.Add
    Next i

    Debug.Print Now

End Sub

実行結果

以下の通り、シートが1000枚作成されました!

21秒の時間で作成が完了しています。

画面描画なし(テクニックを使用する)の場合

サンプルコード

画面描画の停止を、開始・終了時に差し込んでいます。

サンプルコード
Option Explicit

Public Sub testScreenUpdate()

    Debug.Print "-- 画面描画なし --"

    Application.ScreenUpdating = False

    Debug.Print Now

    Dim i As Long
    ' シートを1000枚作成する
    For i = 1 To 1000

        ThisWorkbook.Worksheets.Add
    Next i

    Debug.Print Now

    Application.ScreenUpdating = True

End Sub

実行結果

11秒の時間で作成が完了していますね!

検証結果まとめ

21秒 → 11秒になり、なんと処理時刻が約半分程度にパフォーマンス向上していることが分かります!

# 分類 所要時間
1 画面描画あり 21秒
2 画面描画なし 11秒
差分 10秒

最後に

いかがでしたでしょうか。
今回のテクニックは高速化の基礎中の基礎となります。
どういったマクロを組む場合でも、テンプレートのように画面描画を停止してもいいくらいだと思います!

この記事が、皆さんのお力になれれば嬉しいです!

めい
ちなみに検証の日付を見たら祝日の真っ昼間だけど、友達いないの?
りゅう
ノーコメントでっ!
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

大手外資系コンサルティングファーム勤務。ExcelVBA歴は8年。金融関係のプロジェクトにて約100万レコードを処理するマクロの開発実績あり。ExcelVBAの基礎・応用情報を発信中。

コメント

コメントする

CAPTCHA