Access VBAの「重い処理」を劇的に軽くする!CurrentDbキャッシュ戦略の極意
こんにちは。現場で「なぜかAccessが動くたびに重くなる」「処理が終わらない」という悩みを抱えていませんか?
マクロの記録から一歩踏み出し、プロのエンジニアを目指すあなたに、今日は「Access VBAのパフォーマンスを劇的に向上させる、たった一つの鉄則」をお伝えします。
結論から言います。`CurrentDb`を何度も呼び出すのは、今すぐやめましょう。
—
1. なぜ CurrentDb を繰り返すと「重い」のか?
Access VBAでデータベースを操作する際、避けて通れないのが `CurrentDb` です。これは「現在開いているデータベースに接続する」ための命令です。
しかし、多くの初心者が陥る罠がこれです。
‘ 【アンチパターン】毎回呼び出すと非効率!
For i = 1 To 1000
‘ ループのたびに「データベースへの接続」と「解除」が発生!
CurrentDb.Execute “INSERT INTO T_Log (Msg) VALUES (‘テスト’)”
Next i
なぜこれがダメなのか?
`CurrentDb` は単なる変数ではありません。呼び出すたびに、Access内部で「データベース接続の生成」と「システム管理テーブルへのアクセス」という重い処理が走ります。
これを1000回繰り返すということは、エンジンのスイッチを1000回オン・オフしているようなもの。これではパソコンが悲鳴を上げるのも当然です。
—
2. 劇的改善! 「変数キャッシュ」という設計パターン
プロの現場では、「一度だけ接続し、それを使い回す」という設計が基本です。これを「キャッシュ」と呼びます。
【ベストプラクティス】DAO.Databaseオブジェクトに格納する
Public Sub FastInsert()
‘ 1. データベース接続を管理する変数を宣言
Dim db As DAO.Database
‘ 2. ここで接続を確立し、変数に格納(キャッシュ)
Set db = CurrentDb
‘ 3. ループ内では変数を使う(接続コストゼロ!)
Dim i As Long
For i = 1 To 1000
db.Execute “INSERT INTO T_Log (Msg) VALUES (‘テスト’)”, dbFailOnError
Next i
‘ 4. 最後に明示的に解放する(後述します)
Set db = Nothing
End Sub
この書き方に変えるだけで、処理速度は目に見えて速くなります。Accessが「接続の準備」に費やしていた時間が丸ごとカットされるからです。
—
3. 「Nothing代入」はなぜ必要なのか?
コードの最後に `Set db = Nothing` を書きましたね。これには重要な理由があります。
Accessは非常に優秀なので、プログラムが終了すればメモリを回収してくれます。しかし、「複雑なシステム」や「長時間稼働する処理」では、このメモリ解放がうまく行われず、メモリリーク(メモリのゴミ屋敷化)を引き起こします。
- Set db = Nothing の意味: 「この変数が指し示しているデータベース接続を、今すぐ破棄してメモリを返してね」というAccessへの命令です。
- 現場の作法: 「使い終わった道具は、必ず元の場所に戻す」。これができるエンジニアは、バグの少ない堅牢なシステムを作れます。
—
4. 開発現場で役立つ「さらなる一歩」
ここまでできれば、あなたはもう初心者卒業です。最後に、現場でよく使う「安定化のためのコツ」を伝授します。
接続エラーを甘く見ない(dbFailOnError)
`db.Execute` を使うときは、必ず第2引数に `dbFailOnError` を入れましょう。
これを入れることで、「もしSQL文が間違っていたら、即座にエラーを吐いて処理を止める」ことができます。エラーを無視して処理が進むと、データが壊れた原因がわからなくなり、後で地獄を見ます。
処理の対象を明確にする
`CurrentDb` を使う場合、そのデータベースが「今開いているもの」である前提ですが、稀に外部のデータベースファイルを操作することもあります。その場合も、変数を定義して `DBEngine.OpenDatabase(“パス”)` を使うことで、同じ設計思想で対応可能です。
—
まとめ:ここをクリアすれば、あなたはもう脱初心者!
1. CurrentDb は「使い回す」:変数に格納して、接続コストを最小化する。
2. 最後に解放する:`Set 変数 = Nothing` を忘れずに。
3. 安全性も確保する:`dbFailOnError` でエラーを確実に検知する。
この3つを守るだけで、あなたの書くVBAコードはプロのクオリティにぐっと近づきます。
「動けばいい」から「速く、安全に動く」へ。その小さなこだわりが、やがて巨大なシステムを支える力になります。
もしコードの書き方で迷ったら、いつでもこの記事に戻ってきてくださいね。応援しています!
