なぜあなたのAccessは「重い」のか?――画面描画を止める魔法「Application.Echo」の極意
こんにちは。現場で「動くこと」と「速いこと」の狭間で戦い続ける、あなたの技術の伴走者です。
Access VBAで大量のデータを処理しているとき、画面が小刻みにチラついたり、プログレスバーがなかなか進まなかったりして、じれったい思いをしたことはありませんか?
実は、Accessの処理を劇的に速くする方法があります。それは、VBAに「余計なことをするな」と命令することです。今回は、その核心技術である`Application.Echo`について、現場の知見を交えて解説します。
—
1. なぜ「画面の更新」が処理を遅くするのか?
Accessは、非常に律儀なアプリケーションです。レコードを1件更新するたびに、「今の状態をユーザーに見せなきゃ!」と、せっせと画面を再描画(レンダリング)しようとします。
- 人間にとっては: 処理の経過が見えて安心。
- PCにとっては: グラフィックの描画はメモリとCPUを大量に消費する無駄な作業。
10件程度の更新なら誤差ですが、1,000件、10,000件となると、「描画処理」が全体の9割以上の時間を占めることも珍しくありません。この無駄をバッサリと切り捨てるのが、今回紹介するテクニックです。
—
2. 魔法のメソッド:`Application.Echo` の使い方
`Application.Echo` は、Accessに対して「画面の更新を一時停止せよ」と命令するプロパティです。
基本的な書き方
‘ 画面更新を停止する(オフ)
Application.Echo False
‘ — ここに重たい処理を書く —
‘ 画面更新を再開する(オン)
Application.Echo True
これだけで、処理速度は劇的に向上します。まるで、重い荷物を背負って走っていた選手が、荷物を下ろして全力疾走するようなものです。
—
3. 実践!現場で使える「安全なコード」の極意
ここで一つ、プロのエンジニアとして非常に重要な「落とし穴」を共有します。
もし、`Application.Echo False` を実行した直後にコードでエラーが発生して止まってしまったらどうなるでしょうか?画面が更新されないまま、ユーザーは「Accessが固まった」と勘違いしてパニックになります。
この事態を避けるために、エラーハンドリング(例外処理)とセットで使うのが鉄則です。
Public Sub FastUpdateExample()
‘ エラーが発生しても、必ずEchoを元に戻す構造にする
On Error GoTo ErrorHandler
‘ 1. 描画停止
Application.Echo False
‘ — 大量処理の開始 —
Dim i As Long
For i = 1 To 10000
‘ ここにレコードセットの更新処理などを書く
‘ CurrentDb.Execute …
Next i
‘ — 大量処理の終了 —
CleanExit:
‘ 2. どんな場合でも描画を再開する(重要!)
Application.Echo True
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description
Resume CleanExit
End Sub
このコードのポイント
- `On Error GoTo ErrorHandler`: 何かあっても `CleanExit` ラベルへ強制的に飛ばします。
- `CleanExit`: 処理の最後に必ず配置し、ここで `Echo = True` を行うことで、どんな結果になっても画面が固まったままになるのを防ぎます。
—
4. 陥りやすい「やってはいけないこと」
初学者がよくやってしまうのが、「処理の途中でメッセージボックス(MsgBox)を出す」ことです。
`Application.Echo False` の状態で `MsgBox` を出すと、メッセージボックス自体が画面に表示されなかったり、表示されてもAccessがフリーズしたように見えたりと、ユーザーを混乱させる原因になります。
「Echoをオフにしている間は、ユーザーとの対話を遮断する」。これがプロの流儀です。
—
最後に:効率化の先にあるもの
`Application.Echo` は、いわば「加速装置」です。これを使いこなせるようになると、Accessのポテンシャルを最大限に引き出すことができます。
しかし、最も大切なのは「なぜ遅いのか」を考える癖をつけることです。`Echo` で速くなるのは、あくまで「描画コスト」を削っているだけ。もし処理そのものに非効率なクエリがあれば、そちらを改善する方が本質的です。
ここをクリアしたあなたは、もう「マクロの記録」に頼る初心者ではありません。Accessの心臓部を直接制御できる、立派な開発者の入り口に立っています。
次は、`CurrentDb.Execute` による「クエリの最適化」に挑戦してみませんか?より深い世界が待っていますよ!応援しています。
