【入門編】【初心者】Application.CurrentDbとDBEngine(0)(0)の使い分け:DAO接続のメモリ効率を最大化する – Access VBA解析バイブル

スポンサーリンク

Access VBAの深淵へ:CurrentDbとDBEngine(0)(0)の「メモリ」を巡る賢い選択

こんにちは。Access開発の現場で「なぜか動作が重い」「時々エラーで落ちる」といった壁にぶつかっていませんか?

Access VBAを書き始めると、必ず出会うのがデータベースへの接続方法です。多くの入門書には `CurrentDb` を使えと書いてありますが、大規模なシステム開発の現場では、あえて `DBEngine(0)(0)` という少し古風な書き方を採用することがあります。

今日は、ただコードを動かすだけでなく、「メモリ効率」という視点から、プロのエンジニアがなぜこれらを使い分けるのか、その本質を解説します。ここを理解すれば、あなたのAccess開発は一気に「プロフェッショナル」の領域へ踏み込めますよ。

1. CurrentDb:初心者から中級者へのスタンダード

まずは、基本中の基本である `CurrentDb` です。

‘ CurrentDbを使った標準的なレコードセットの取得
Dim db As DAO.Database
Dim rs As DAO.Recordset

Set db = CurrentDb
Set rs = db.OpenRecordset(“T_売上データ”, dbOpenDynaset)

‘ 処理を記述…

rs.Close
Set rs = Nothing
Set db = Nothing

CurrentDbの正体

`CurrentDb` は、現在開いているデータベースの「新しいインスタンス」を生成して返します。
非常に扱いやすく、直感的です。しかし、ここで一つ重要な注意点があります。「CurrentDb を呼ぶたびに、メモリ上にデータベースへの参照が新しく作成される」という性質です。

ループ処理の中で無造作に `CurrentDb` を連発すると、メモリの解放が追いつかず、Accessが徐々に重くなっていく原因になります。

2. DBEngine(0)(0):伝説のアーキテクトが好む理由

次に、少しマニアックに見える `DBEngine(0)(0)` です。
これは、DAOのエンジンが管理している「現在開いているデータベースそのもの」を直接参照する方法です。

‘ DBEngine(0)(0)を使った接続
Dim db As DAO.Database
Dim rs As DAO.Recordset

‘ 新規作成ではなく、既に存在している接続を参照する
Set db = DBEngine(0)(0)
Set rs = db.OpenRecordset(“T_売上データ”, dbOpenDynaset)

‘ 処理を記述…

rs.Close
‘ 注意:DBEngine(0)(0)で取得したdbは、基本的にNothingにしない
Set rs = Nothing

なぜこれが「効率的」なのか?

1. オーバーヘッドの削減: `CurrentDb` のように「新しいインスタンスを生成する」プロセスをスキップするため、メモリ消費と処理時間をわずかに削減できます。
2. メモリ管理の安定: `CurrentDb` は呼び出すたびにオブジェクトを再生成しますが、`DBEngine(0)(0)` は既存の接続を使い回します。特に、複雑な再帰処理や大規模なループ処理を行う際、メモリリークのリスクを最小限に抑えることができます。

3. どっちを使うべき? 使い分けの極意

ここまでの話を整理しましょう。

| 特徴 | CurrentDb | DBEngine(0)(0) |
| :— | :— | :— |
| 可読性 | 高い(直感的) | 低い(慣れが必要) |
| メモリ負荷 | 呼び出しごとに増える | 非常に低い(安定) |
| 推奨シーン | 通常のフォームやボタン処理 | 大量データのバッチ処理、複雑なループ |

先輩からのアドバイス

  • 普段使い(フォーム上の操作など): `CurrentDb` で全く問題ありません。コードの読みやすさが保守性を高めます。
  • バックグラウンド処理(CSVインポート、大量集計など): `DBEngine(0)(0)` を使いましょう。特に、長時間稼働するモジュールでは、この選択が「落ちないシステム」の鍵を握ります。

4. 最後に:メモリを解放する習慣を

どちらを使うにせよ、最も大切なのは「使い終わったオブジェクトは即座に解放する」というエンジニアの作法です。

‘ どんなに急いでいても、これだけは守る
rs.Close
Set rs = Nothing
‘ CurrentDbを使っているならdbもNothingにする
Set db = Nothing

`Set rs = Nothing` を書くことは、単なるおまじないではありません。Accessに対して「もうこのメモリ領域は使わないよ、掃除していいよ」と伝える大切な命令です。

まとめ

  • CurrentDb は「安全・便利」な標準ツール。まずはここから始めましょう。
  • DBEngine(0)(0) は「軽量・高速」な玄人ツール。大規模処理でメモリが不安になったら思い出してください。

Access VBAの世界は、こうした小さな気配りの積み重ねで、驚くほど軽快で強固なものになります。ぜひ、今日のコードから「メモリの持ち主」を意識してみてください。

ここをクリアすれば、あなたはもう立派なAccessアーキテクトの仲間入りです。次回のステップアップも楽しみにしていてくださいね!

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