【入門編】「クエリの保存」を最小限にする:QueryDefを一時オブジェクトとして作成・削除するメモリ管理術 – Access VBA解析バイブル

スポンサーリンク

Accessのデータベースが「重い」原因はこれだ!QueryDefを使い捨てにするメモリ管理術

Accessで開発をしていると、いつの間にかデータベースファイル(.accdb)が肥大化し、動作がもっさりとしてきた経験はありませんか?

その原因の多くは、「クエリを保存しすぎていること」にあります。

画面の裏でクエリを1つ作るたびに、Accessは内部的に「QueryDef」というオブジェクトをデータベースファイル内に書き込みます。これを繰り返すと、ファイルサイズは膨らみ、最適化の頻度も増え、パフォーマンスは低下の一途をたどります。

今日は、「必要な時だけクエリを作り、終わったら即座に消去する」という、プロの現場で必須のメモリ管理術を伝授します。

—

そもそもQueryDefって何者?

Accessの「クエリデザイン」画面で作るクエリは、保存すると「永続的なQueryDef」としてデータベースの一部になります。しかし、VBAでSQLを組み立てて実行する場合、わざわざ保存する必要はありません。

「一時的なQueryDef」を使えば、メモリ上でクエリを実行し、処理が終われば消し去ることができます。これにより、ファイルサイズを増やさずに、動的なSQL(条件によって変わるSQL)を安全かつ高速に実行できるのです。

—

現場で使える「使い捨てQueryDef」の設計パターン

では、実際のコードを見てみましょう。ポイントは「作成(CreateQueryDef)」して「実行」したら、すぐに「削除(Delete)」することです。

Public Sub ExecuteDynamicQuery()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSQL As String
Dim userID As Long

‘ 1. 現在のデータベースオブジェクトを取得
Set db = CurrentDb

‘ 2. 動的なSQLを生成(例: 特定のユーザーのデータを抽出)
userID = 101
strSQL = “SELECT FROM T_Orders WHERE UserID = ” & userID

‘ 3. 一時的なQueryDefを作成(名前を空文字””にすると一時オブジェクトになる)
‘ 名前を付けないことで、データベースウィンドウを汚さずメモリ上で完結します
Set qdf = db.CreateQueryDef(“”, strSQL)

‘ 4. クエリを実行(レコードセットを開く例)
Dim rs As DAO.Recordset
Set rs = qdf.OpenRecordset(dbOpenSnapshot)

‘ — ここでデータを加工したり処理したりする —
Debug.Print “レコード件数: ” & rs.RecordCount

‘ 5. 終了処理(非常に重要!)
rs.Close
qdf.Close

‘ オブジェクトの解放
Set rs = Nothing
Set qdf = Nothing
Set db = Nothing
End Sub

このコードの「賢いポイント」

  • `db.CreateQueryDef(“”, strSQL)`: 第一引数を空文字 `””` にするのが最大のコツです。これにより、Accessは「これは永続保存しない一時的なクエリだ」と理解し、メモリ上で処理を行います。
  • ゴミを残さない: 明示的に `qdf.Close` を呼び出し、メモリを解放しています。これにより、PCのメモリを無駄に占有しません。

—

初学者が陥りやすいエラーとその対策

1. 名前を付けて保存しようとしてしまう

「`db.CreateQueryDef(“TempQuery”, strSQL)`」のように名前を付けてしまうと、同名のクエリが既に存在する場合に「名前が重複しています」というエラーが発生します。一時利用なら必ず名前は `””`(空文字)にしましょう。

2. オブジェクトの解放忘れ

`Set qdf = Nothing` を忘れると、VBAのメモリ管理が追いつかず、複雑な処理を繰り返した際に「システムリソース不足」に陥ることがあります。「作ったら消す」は、プログラミングの鉄則です。

3. パラメータの注入によるSQLインジェクション

上記の例では数値をそのまま代入していますが、文字列を扱う場合は注意が必要です。動的SQLを組む際は、可能な限りパラメータクエリ(`Parameters`コレクション)を使用することをおすすめします。

—

まとめ:Accessを「軽く」使いこなすために

今回ご紹介した「一時的なQueryDef」の手法は、Accessのパフォーマンスを維持する上で非常に強力な武器になります。

  • 保存するクエリは、再利用するものだけにする
  • 使い捨てのSQLは、メモリ上で完結させる
  • `Close`と`Nothing`をセットで書く習慣をつける

この3つを意識するだけで、あなたのAccessアプリは驚くほど軽快で、堅牢なものに生まれ変わります。ここをクリアすれば、あなたはもう脱・初心者です。さあ、自信を持って次のコードを書き進めてください!

何か不明点や、「こんなSQLの動的生成で詰まっている」という悩みがあれば、いつでも相談してくださいね。応援しています!

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