Access VBA の DAO.QueryDef

Access VBA の DAO.QueryDef は、保存されたクエリまたは一時的なクエリ定義を操作するためのオブジェクトです。主に SQL クエリを実行する際に使用され、パラメータ付きクエリを安全に実行できるのが特徴です。


目次

🔷 概要:DAO.QueryDef とは?

  • QueryDefDAO(Data Access Objects)ライブラリのオブジェクトです。
  • SQL クエリ(SELECT / INSERT / UPDATE / DELETE など)を表します。
  • Access 内の保存クエリと同様の機能を VBA 上で扱えます。
  • Parameters コレクションで、パラメータクエリに対応可能。
  • 一時的な(名前なし)クエリも作成できます。

🔷 主な用途

用途内容
一時クエリの実行SQL文を直接書いて、実行。保存せずに使い捨て可能
パラメータクエリの実行qdf.Parameters で値を設定し、安全にクエリを実行
保存クエリの呼び出し・実行Access に保存されたクエリを QueryDefs("クエリ名") で実行
SQL の再利用・動的生成コードで SQL を組み立てて実行できる。可読性や再利用性が高い

🔷 基本構文(名前なしクエリ)

Sub RunQuery()
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim strSQL As String

    Set db = CurrentDb()
    strSQL = "SELECT * FROM ユーザー WHERE 年齢 > 30;"
    Set qdf = db.CreateQueryDef("", strSQL) ' 一時クエリ(保存しない)

    ' 結果取得
    Dim rs As DAO.Recordset
    Set rs = qdf.OpenRecordset()

    Do Until rs.EOF
        Debug.Print rs("ユーザー名")
        rs.MoveNext
    Loop

    rs.Close
    Set rs = Nothing
    Set qdf = Nothing
    Set db = Nothing
End Sub

🔷 パラメータ付きクエリの例

Sub RunParamQuery()
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim strSQL As String

    Set db = CurrentDb()
    strSQL = "SELECT * FROM ユーザー WHERE 年齢 > [minAge] AND 性別 = [gender];"
    Set qdf = db.CreateQueryDef("", strSQL)

    ' パラメータの設定
    qdf.Parameters("[minAge]") = 25
    qdf.Parameters("[gender]") = "男性"

    Dim rs As DAO.Recordset
    Set rs = qdf.OpenRecordset()

    Do Until rs.EOF
        Debug.Print rs("ユーザー名")
        rs.MoveNext
    Loop

    rs.Close
    Set rs = Nothing
    Set qdf = Nothing
    Set db = Nothing
End Sub

🔷 保存クエリ(名前付き)の操作

Sub UseSavedQuery()
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef

    Set db = CurrentDb()
    Set qdf = db.QueryDefs("年齢検索クエリ") ' Access 上に保存されたクエリ名

    qdf.Parameters("[minAge]") = 30
    qdf.Parameters("[gender]") = "女性"

    Dim rs As DAO.Recordset
    Set rs = qdf.OpenRecordset()

    Do Until rs.EOF
        Debug.Print rs("ユーザー名")
        rs.MoveNext
    Loop

    rs.Close
    Set rs = Nothing
    Set qdf = Nothing
    Set db = Nothing
End Sub

🔷 注意点とポイント

項目内容
パラメータの順序名前で設定するので順序に依存しない(安心)
エラー防止クエリに必要な全パラメータを Parameters() で設定しないとエラーになります
一時クエリ名は “”保存しないクエリは CreateQueryDef("", sql文) で名前を空文字にします
保存したいときは名前付きCreateQueryDef("クエリ名", sql文) で保存できます(既存名と重複注意)

🔷 まとめ

項目内容
型名DAO.QueryDef
主な機能SQL文の定義と実行(パラメータ付き対応)
メリットSQL の再利用性、安全性向上、保守性アップ
主な用途一時的なクエリ実行、パラメータ処理、保存クエリの実行

よかったらシェアしてね!
目次