Access VBAの「画面のちらつき」を封じ込めろ! Application.Echo で処理速度を劇的に向上させる極意
こんにちは。現場で泥臭い自動化と向き合い続け、VBAの裏側にある「オブジェクトの呼吸」までを知り尽くしたアーキテクトです。
Accessで大量のデータを処理しているとき、画面がバチバチと激しく点滅し、処理が終わるまでマウスカーソルが砂時計になって固まる……そんな経験はありませんか?
それは、「VBAが描画エンジンを呼び出すたびに、Windowsが無理やり画面を書き換えているから」です。
今日は、Access VBAを一段上のレベルへ引き上げるための基本技術、`Application.Echo` メソッドによる「画面描画の凍結」について、その本質を徹底解説します。ここをマスターすれば、あなたのコードは劇的に速く、洗練されたものになりますよ。
—
1. なぜ「画面の更新」が処理の足を引っ張るのか?
私たちが普段見ているAccessの画面は、VBAが「何か書き換える」たびに、その結果を視覚的に表示しようとします。
- データ1万件をループで更新する処理を想像してください。
- Accessは、1件更新するごとに「はい、画面を更新しました!」「次も更新しました!」と律儀に画面を描画し続けます。
この「画面描画(UIのレンダリング)」という作業は、実はCPUにとって非常に重い処理です。データ処理そのものより、画面を描画するコストの方が遥かに高いことさえ珍しくありません。
`Application.Echo False` を使うことは、「画面を描画するな。裏側で黙々と処理だけを終わらせろ」とAccessに命令することと同義です。
—
2. 実践:Application.Echo の正しい書き方
ただ `False` にするだけではいけません。もっとも重要なのは、「処理が終わったら必ず画面を元に戻す」という責任です。もしエラーで止まって画面が固まったままになったら、ユーザーは混乱してしまいますよね。
現場で使える、鉄壁のテンプレートがこれです。
Public Sub UpdateLargeData()
‘ エラーが発生しても確実に画面更新を再開するためのエラーハンドリング
On Error GoTo ErrorHandler
‘ 1. 画面の更新を停止する(劇的に速くなります)
Application.Echo False
‘ — ここに重たい処理を記述 —
Dim db As DAO.Database
Set db = CurrentDb
‘ 例:大量のレコードを更新する処理など
db.Execute “UPDATE T_Master SET Status = ‘更新済’ WHERE Status IS NULL”, dbFailOnError
‘ —————————-
ExitRoutine:
‘ 2. 処理終了後、必ず画面更新を再開する
Application.Echo True
Exit Sub
ErrorHandler:
‘ 3. エラーが発生した際も、画面が固まったままにならないよう必ず復帰させる
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Resume ExitRoutine
End Sub
このコードのポイント
- `Application.Echo False`: 魔法のスイッチです。これを実行した瞬間、画面は「フリーズ」したかのように静止し、処理速度が数倍〜数十倍に跳ね上がります。
- `On Error GoTo` と `Resume`: 伝説的なエンジニアは「エラーは起こるもの」という前提でコードを書きます。`ExitRoutine` というラベルを用意して、正常終了時も異常終了時も、必ず `Application.Echo True` を通るように設計するのがプロの流儀です。
—
3. 初心者が陥りやすい「罠」
初心者の方がよくやってしまうのが、「処理の途中で `MsgBox` を出してしまう」ことです。
`Application.Echo False` を実行している間は、Accessは「画面に関すること」を無視します。その状態で `MsgBox` を出すと、メッセージボックス自体が表示されなかったり、Accessがハングアップしたように見えたりと、ユーザーを不安にさせる挙動になります。
鉄則:`Application.Echo False` の間は、ユーザーへの対話(MsgBoxやInputBox)を行わない。
—
4. さらなる高みへ:さらに速くするために
実は、`Echo` 以外にも高速化の秘訣はあります。
1. `CurrentDb` は変数に格納する:
`CurrentDb` をループ内で何度も呼び出すのは、毎回データベースの接続を開き直すような無駄なコストがかかります。上のコードのように、一度変数にセットしてから使い回すのが基本中の基本です。
2. `DoCmd.SetWarnings False`:
アクションクエリ(追加・更新・削除)を使う場合、Accessは「〇〇件のデータを変更しますか?」と聞いてきます。これも処理の邪魔なので、`SetWarnings` でOFFにするのが定石です。
—
最後に:エンジニアとしての心構え
「画面を止める」という発想は、単なる小手先のテクニックではありません。「ユーザーが今、何を見たいのか」「コンピュータは何をすべきで、何をすべきでないのか」を制御するという、システム設計の本質に触れる部分です。
この `Application.Echo` を自在に操れるようになったあなたは、もう「マクロの記録」に頼る初心者ではありません。Accessという巨大なオブジェクトモデルを、自分の手の中に収め始めた証拠です。
ぜひ、あなたの現在のプロジェクトで、この「魔法のスイッチ」を試してみてください。その圧倒的な速度差に、きっと驚くはずですよ。
それでは、また次回の深掘りでお会いしましょう。健闘を祈ります!
