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アーキテクトの仲間入りです。次回のステップアップも楽しみにしていてくださいね!
