【入門編】QueryDefの実行結果をフォームのレコードソースに動的に割り当てる – Access VBA解析バイブル

スポンサーリンク

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における「疎結合(パーツ同士が独立していること)」の第一歩です。

ここをクリアすれば、あなたはもう「マクロの記録」に頼る脱初心者です。次は、より複雑なパラメータクエリを用いた実行計画の最適化へ進んでいきましょう。

何か分からないことがあれば、いつでも聞いてください。あなたの自動化の旅を、全力でサポートします。

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