概要
Excel VBAにおける高速化の基本中の基本、それが「画面描画の停止」です。これまで3回にわたり、Application.ScreenUpdatingプロパティを用いた基本的な制御方法から、その注意点について解説してきました。最終回となる今回は、マクロ実行時の「余計な画面」を完全に排除し、かつ「予期せぬエラー発生時」でも確実に環境を復旧させるための、プロフェッショナルな実装パターンを伝授します。単に停止するだけでなく、どのような状況下でも安定した動作を保証する「守りのVBA」を構築しましょう。
詳細解説
マクロを高速化させる際、多くの初心者は「Application.ScreenUpdating = False」をコードの冒頭に記述し、最後に「True」に戻すという単純なロジックを組みます。しかし、実務レベルの複雑な処理では、途中でエラーが発生し、プログラムが強制終了することがあります。その際、ScreenUpdatingがFalseのまま取り残されると、Excelの画面更新が停止したままになり、ユーザーは「Excelがフリーズした」と勘違いしてしまいます。
これを防ぐためには、VBAの「エラーハンドリング」と「終了処理の共通化」を組み合わせる必要があります。単にコードの最後にTrueを書くのではなく、GoTo構文を利用して、正常終了時もエラー発生時も必ず「設定を元に戻す処理」を通るように設計するのです。
また、画面更新だけでなく、以下の3つの設定を組み合わせることで、マクロの実行速度は劇的に向上します。
1. Application.ScreenUpdating(画面更新の停止)
2. Application.Calculation(自動計算の停止)
3. Application.DisplayAlerts(警告メッセージの非表示)
これらすべてを制御することで、Excelは「裏側で淡々と計算を行う計算機」へと変貌し、ユーザーの視覚的なストレスをゼロにします。
サンプルコード
以下のコードは、実務でそのまま利用できる「標準的なプロフェッショナル・テンプレート」です。
Sub プロフェッショナルなマクロ構成()
' 速度向上のための設定退避用変数
Dim originalScreenUpdating As Boolean
Dim originalCalculation As XlCalculation
Dim originalDisplayAlerts As Boolean
' 現在の設定を退避
originalScreenUpdating = Application.ScreenUpdating
originalCalculation = Application.Calculation
originalDisplayAlerts = Application.DisplayAlerts
' 高速化のための設定
On Error GoTo ErrorHandler
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.DisplayAlerts = False
' --- ここからメインの処理 ---
' 大量のセル操作やシートコピーなど
Dim i As Long
For i = 1 To 1000
Cells(i, 1).Value = "処理中"
Next i
' -------------------------
GoTo Finally
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
Finally:
' 設定を元に戻す(最重要)
Application.ScreenUpdating = originalScreenUpdating
Application.Calculation = originalCalculation
Application.DisplayAlerts = originalDisplayAlerts
End Sub
実務アドバイス
実務でこの技術を扱う際、最も注意すべき点は「デバッグ時」です。開発中にScreenUpdatingをFalseに固定してしまうと、ステップ実行(F8キー)でコードを追う際、画面が動かないため、どこまで処理が進んでいるのか視覚的に判断できなくなります。
これを解決するテクニックとして、私は開発中には以下のように「定数」を活用することをお勧めします。
#Const DEBUG_MODE = True ' 開発時はTrue、配布時はFalseにする
Sub 開発用コード()
#If DEBUG_MODE = False Then
Application.ScreenUpdating = False
#End If
' 処理内容...
#If DEBUG_MODE = False Then
Application.ScreenUpdating = True
#End If
End Sub
このように、条件付きコンパイル(#If)を使用することで、開発中(True)は画面更新を有効にし、デバッグを容易に保ちつつ、完成して配布する際(False)には自動的に高速化モードになるよう切り替えることができます。これは大規模なプロジェクトを管理するベテランの間では常識とも言える手法です。
また、もう一つの重要なアドバイスとして、「処理が非常に長いループ」の場合は、適宜「DoEvents」を挟むことを検討してください。ScreenUpdatingをオフにすると、Windows側からは「応答なし」と判断されやすくなります。もしマクロの実行時間が数分を超えるような場合は、数千回に一度DoEventsを実行することで、Excelのフリーズ感を緩和し、ユーザーに「動いている」という安心感を与えることができます。
まとめ
第19回にわたる連載の最後として、改めて強調したいのは「環境を汚さない」というマナーです。マクロは、実行した環境の状態を、実行前と全く同じ状態(あるいは意図した状態)に戻して終了しなければなりません。
1. ScreenUpdatingのオフは、エラーハンドリングとセットで実装する。
2. CalculationやDisplayAlertsも併用し、総合的なパフォーマンスを追求する。
3. 開発時と本番時で設定を切り替えられる仕組みを作る。
この3点を徹底するだけで、あなたの書くVBAコードの信頼性は一段と高まります。ただ「速く動く」だけでなく、「エラーが起きても後始末が完璧である」。これこそが、ベテランと初心者を分かつ最大の境界線です。
今回紹介したテンプレートを自身のツールボックスに登録し、どのような業務ツールを作成する際にも必ず組み込んでください。マクロ実行時の余計な画面を消す技術は、単なる高速化テクニックではなく、Excelプログラマーとしての品格を表す重要なスキルなのです。これにて「画面を消す」シリーズは完結となります。皆さんのVBAライフが、より快適で効率的になることを願っています。
