Access VBAの真髄:QueryDefで「爆速」レコードソース制御をマスターする
こんにちは。現場で泥臭い自動化から、洗練されたアーキテクチャ設計までを渡り歩いてきたエンジニアです。
Access開発において、多くの人が「フォームを開くたびに全データを読み込んで重い…」「検索条件を変えるたびにSQL文の組み立てで悩む」という壁にぶつかります。
今日は、Accessの隠れた実力者「QueryDef(クエリ定義)」を使いこなし、フォームのレコードソースを自由自在に操る「極限のテクニック」を伝授します。これさえ覚えれば、Accessの描画は劇的に速くなり、コードのメンテナンス性も別次元へ進化します。
—
1. なぜ「QueryDef」を使うのか?
通常、フォームのレコードソースに直接SQLを書いたり、フォーム上で複雑なフィルタをかけたりしていませんか?
あれは、Accessにとって「毎回ゼロから料理を作る」ようなもの。効率が悪く、メモリにも負荷がかかります。
QueryDefを使うメリットは以下の3点です。
- 事前の最適化: Accessエンジンが実行計画を事前にキャッシュできるため、実行速度が格段に速い。
- カプセル化: SQL文をフォームのコードから分離し、クエリ単体でテスト・修正が可能。
- セキュリティ: パラメータクエリとして扱うことで、SQLインジェクションなどのリスクを回避しやすい。
—
2. 実践:動的SQLでフォームを制御するコード
まずは、特定のクエリ(例えば `qryDynamicSource`)を動的に書き換え、フォームに適用する基本パターンを見てみましょう。
Public Sub UpdateFormRecordSource(strCondition As String)
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSQL As String
Set db = CurrentDb
‘ 1. 対象のクエリ定義を取得
Set qdf = db.QueryDefs(“qryDynamicSource”)
‘ 2. 実行したいSQLを組み立てる
‘ 常に「WHERE 1=1」を入れておくと、後の条件追加が非常に楽になります
strSQL = “SELECT FROM T_Employees WHERE 1=1 ” & strCondition
‘ 3. クエリ定義のSQLを書き換える(ここが肝!)
qdf.SQL = strSQL
‘ 4. メモリ解放
qdf.Close
Set qdf = Nothing
Set db = Nothing
End Sub
フォーム側での呼び出し方
フォームを開く前(`Open`イベント)や、検索ボタンを押したタイミングで以下のように呼び出します。
Private Sub btnSearch_Click()
‘ 条件を動的に生成
Dim condition As String
condition = ” AND DepartmentID = ” & Me.txtDeptID.Value
‘ クエリを更新
UpdateFormRecordSource condition
‘ フォームにクエリを再読み込みさせる
Me.RecordSource = “qryDynamicSource”
Me.Requery
End Sub
—
3. 初学者が陥りやすい「3つの罠」
このテクニックを実装する際、多くの人がここでつまずきます。心に留めておいてください。
① オブジェクトの解放を忘れる
`Set qdf = Nothing` を省略すると、メモリ上に参照が残り続け、Accessが不安定になります。「開いたら必ず閉じる」。これはエンジニアの鉄則です。
② SQLの構文エラー(特に引用符)
`WHERE Name = ‘田中’` のように、文字列を囲むシングルクォーテーションを忘れるケースが非常に多いです。コード内で文字列を組み立てる際は、`Replace`関数などでシングルクォーテーションをエスケープする癖をつけましょう。
③ クエリの保存と実行タイミング
`qdf.SQL = strSQL` を実行した直後にフォームの`Requery`を呼ぶのが重要です。クエリがディスクに書き込まれる前にフォームが読み込みにいかないよう、同期を意識してください。
—
4. チーフアーキテクトからのアドバイス
QueryDefを使いこなすと、「GUIで見えるクエリ」と「VBAで制御するクエリ」を明確に切り分けることができるようになります。
初心者のうちは、すべてをフォームの「レコードソース」プロパティに直接書き込みがちですが、それは「可読性の墓場」への入り口です。クエリ定義という「部品」を一つ作っておき、それをVBAで書き換えるという考え方は、Accessにおける「疎結合(パーツ同士が独立していること)」の第一歩です。
ここをクリアすれば、あなたはもう「マクロの記録」に頼る脱初心者です。次は、より複雑なパラメータクエリを用いた実行計画の最適化へ進んでいきましょう。
何か分からないことがあれば、いつでも聞いてください。あなたの自動化の旅を、全力でサポートします。
