【VBAリファレンス】第19回 マクロ実行時の余計な画面を消す 1/4 – 画面更新の停止による高速化と安定化の極意

スポンサーリンク

概要

Excel VBAを駆使して業務効率化を図る際、避けて通れないのが「マクロ実行中の画面のチラつき」と「処理速度の低下」という問題です。マクロを実行した瞬間、画面が激しく点滅し、計算やシート移動の様子が逐一表示されることで、ユーザーは不安を感じ、動作も著しく遅延します。本稿では、VBA開発の基礎でありながら、プロフェッショナルなアプリケーション開発には欠かせない「画面更新の停止(ScreenUpdating)」について詳しく解説します。このテクニックを習得することで、あなたのマクロは劇的に速く、そして洗練された挙動を手に入れることになります。

詳細解説

Excel VBAには、アプリケーションの挙動を制御するための「Applicationオブジェクト」が存在します。このオブジェクトの「ScreenUpdating」プロパティを操作することで、Excelの描画機能を一時的に停止させることが可能です。

通常、VBAでセルに値を代入したり、シートを選択したりするたびに、Excelは「画面を再描画する」という処理を行います。1回や2回の操作であれば影響は微々たるものですが、数千行のデータ処理を行う場合、この「再描画」がCPUの処理能力を大幅に消費し、マクロの速度を低下させる最大の原因となります。

ScreenUpdatingを「False」に設定すると、Excelは内部でデータ計算やシート操作のみを行い、画面上への反映を保留します。これにより、OSの描画負荷が軽減され、処理速度が飛躍的に向上します。特に、大量のデータをループ処理で書き込む場合や、複雑なグラフを生成する場合において、この設定は必須と言えます。

また、画面更新を停止させることは、単なる高速化以上のメリットをもたらします。それは「ユーザー体験の向上」です。実行中に画面が目まぐるしく切り替わると、ユーザーは「何が起きているのか」「フリーズしたのではないか」という不安を抱きます。更新を停止し、処理が終わった瞬間に結果を表示させることで、まるで専用ソフトウェアのような安定感とプロフェッショナルな外観を演出することができるのです。

サンプルコード

以下に、画面更新を停止させる基本的なパターンを記述します。VBAで処理を記述する際、必ず「エラーハンドリング」とセットで運用することが重要です。もし処理の途中でエラーが発生し、ScreenUpdatingをTrueに戻すコードが実行されなかった場合、Excelの画面が一生更新されなくなるという致命的な事態に陥るためです。


Sub OptimizeMacroPerformance()
    ' 画面更新を停止し、処理速度を向上させる
    ' 処理中に発生する画面のチラつきを抑える
    
    Dim originalScreenUpdating As Boolean
    originalScreenUpdating = Application.ScreenUpdating
    
    On Error GoTo ErrorHandler
    
    Application.ScreenUpdating = False
    
    ' --- ここに本来の重い処理を記述 ---
    Dim i As Long
    For i = 1 To 10000
        Cells(i, 1).Value = "データ処理中 " & i
    Next i
    ' --------------------------------
    
    ' 正常終了時に画面更新を元に戻す
    Application.ScreenUpdating = True
    
    MsgBox "処理が完了しました。", vbInformation
    
    Exit Sub

ErrorHandler:
    ' エラーが発生した場合でも必ず画面更新を有効に戻す
    Application.ScreenUpdating = True
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub

実務アドバイス

実務におけるマクロ開発では、単にScreenUpdatingをFalseにするだけでなく、さらなる最適化を意識する必要があります。

第一に、「計算方法の自動設定解除」との併用です。ScreenUpdatingと同時に「Application.Calculation = xlCalculationManual」を設定することで、セル値を変更するたびに発生する再計算を抑制でき、処理速度はさらに向上します。

第二に、「ステータスバーの活用」です。画面更新を停止すると、マクロが現在どの程度進んでいるのかユーザーから見えなくなります。そのため、Application.StatusBarプロパティを使用して、「現在50%処理中…」といった進捗状況をユーザーに提示する配慮が、ベテランのエンジニアには求められます。

第三に、「SelectやActivateの排除」です。画面更新を停止していても、VBAコード内でActiveSheetやSelectionを多用していると、予期せぬエラーや挙動の不安定さを招くことがあります。シートを直接指定する「Worksheets(“Sheet1”).Range(“A1”)」のような記述方式を徹底することで、更新停止の恩恵を最大限に引き出すことができます。

まとめ

マクロ実行時の画面更新停止は、VBAプログラミングにおける「作法」の基本です。しかし、その基本を徹底できているかどうかが、アマチュアとプロフェッショナルの分かれ道となります。

今回解説したScreenUpdatingプロパティは、以下の3点を意識して運用してください。
1. 処理の開始時にFalseにし、終了時に必ずTrueに戻すこと。
2. エラーハンドリングを組み込み、異常終了時でも必ずTrueに戻るように制御すること。
3. 高速化だけでなく、ユーザー体験を損なわないための進捗表示などと組み合わせて実装すること。

この技術をマスターすることで、あなたのExcelマクロは、単なる「自動化ツール」から、業務を支える「堅牢なシステム」へと進化します。次回以降の連載では、さらに一歩踏み込んだ「警告メッセージの抑制」や「イベントの無効化」についても掘り下げていきます。まずは、お手元の現在動いているマクロにこのコードを組み込み、その実行速度の変化を体感してみてください。VBAの可能性は、適切なチューニングによって無限に広がります。

タイトルとURLをコピーしました