【実務・中級編】Application.Echoを制御する汎用クラスの作成:エラー発生時でも画面描画を復帰させる – Access VBA解析バイブル

スポンサーリンク

Access VBAの「画面フリーズ」を撲滅せよ:Application.Echoを制御する最強のクラス設計

Accessで大規模なデータ処理や帳票生成を行う際、`Application.Echo False` を使って画面描画を停止するのは常識だ。しかし、この手法には致命的な「落とし穴」がある。

処理の途中でエラーが発生し、`Echo True` に戻す前にコードが止まったらどうなるか?

ユーザーは画面が固まったままのAccessを前に呆然とし、タスクマネージャーから強制終了する羽目になる。これはツール開発者として最も避けるべき「UXの崩壊」だ。

今回は、VBAのクラスモジュールのライフサイクルを完璧に制御し、「エラーが発生しようが、処理が完了しようが、確実に描画を復帰させる」ための、実務で使える極限のEcho制御クラスを伝授する。

なぜ「プロシージャ内での制御」は脆弱なのか

多くの初心者は、プロシージャの先頭で `Echo False` を書き、`On Error GoTo` で飛ばしたエラーハンドラ内で `Echo True` を書こうとする。

‘ 悪しき習慣:コードの至る所に終了処理を書く必要がある
Sub BadPractice()
Application.Echo False
On Error GoTo ErrHandler

‘ ここでエラーが起きたら…

Application.Echo True
Exit Sub
ErrHandler:
Application.Echo True ‘ 結局ここにも書かなければならない
End Sub

これの何が問題か?「書き忘れ」と「メンテナンス性の欠如」だ。処理が複雑化し、`Exit Sub` や複数の分岐が混在した瞬間、必ずどこかで戻し忘れが発生する。

クラスの「終了処理(Terminate)」こそが解である

VBAのクラスモジュールには、そのインスタンスがメモリから解放される瞬間に必ず実行される `Class_Terminate` イベントがある。これを利用するのだ。

インスタンスが生存している間だけ描画を停止し、スコープを抜けてインスタンスが破棄された瞬間に、エラーの有無に関わらず自動的に `Echo True` を叩く。これが堅牢な設計というものだ。

実装コード:`clsEchoController`

このクラスをプロジェクトにインポートし、以下のコードを記述する。

‘ クラスモジュール名: clsEchoController
Option Explicit

‘ インスタンス生成時に自動で描画停止
Private Sub Class_Initialize()
Application.Echo False
End Sub

‘ インスタンスが破棄される瞬間に自動で描画再開
Private Sub Class_Terminate()
‘ 念のため、エラーが発生していても確実に復帰させる
If Not Application.Echo Then
Application.Echo True
End If
End Sub

実務での利用方法:極めてシンプルに

使い方は、処理の冒頭でインスタンスを生成するだけ。これだけで、プロシージャの終了時に自動的に描画が復帰する。

Sub MainProcess()
‘ インスタンスを作成した時点で Echo False
Dim eco As New clsEchoController

‘ 長大な処理を実行
‘ 途中で予期せぬエラーが発生しても、
‘ このプロシージャを抜けた瞬間に eco が破棄され、Terminateが走る。
‘ つまり、確実に画面描画が復帰する。

Debug.Print “重い処理を実行中…”

‘ 終了処理を意識する必要は一切ない
End Sub

プロダクション環境のための「3つの注意点」

このアーキテクチャを採用する上で、知っておくべき現場の知見がある。

1. 暗黙の参照に注意せよ: このクラスを保持する変数の寿命がプロシージャを超えてしまうと、描画が復帰しない。必ずプロシージャ内でローカル変数として定義すること。
2. ネストの考慮: もし複数の場所で `clsEchoController` を使いたい場合、このクラスを少し改造し、`Application.Echo` の状態をスタック管理する必要があるが、基本的には1つのプロシージャで完結させるのが最も美しい。
3. エラーハンドラとの共存: このクラスは「描画の復帰」を保証するが、「エラーの通知」を止めるものではない。エラーハンドラは別途、適切にログ出力やユーザー通知のために記述しておく必要がある。

結論:コードを「書く」のではなく「管理」せよ

優れたエンジニアは、コードの行数を減らすことではなく、「例外的な事態をいかに正常なフローに巻き込めるか」を考える。

`Class_Terminate` に終了処理を委譲することで、あなたは「エラー時にどう描画を戻すか」という退屈な懸念から解放される。その分のリソースを、ビジネスロジックの改善や、より高度なデータ処理の最適化に注ぎ込むべきだ。

Access開発は、こうした細かな「負の遺産」を積み上げない設計が、数年後の保守運用コストを劇的に変える。さあ、今すぐあなたのプロジェクトから `Echo True` の書き忘れを一掃してほしい。

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