Access のパラメータクエリを用いると、条件に応じたデータだけを抽出して Excel へ出力できます。本記事では DAO(Data Access Objects)の QueryDef
を使用し、参照設定なしで動作する VBA コードをご紹介いたします。
目次
サンプルコード
Sub ImportParamQueryWithHeaders()
Dim daoObj As Object ' DAO エンジン
Dim accDB As Object ' Access DB 接続
Dim qdParam As Object ' QueryDef オブジェクト
Dim rsResult As Object ' レコードセット
Dim colIdx As Long ' ヘッダー用ループ
Dim dbFullPath As String ' データベース パス
' Access ファイルの場所を設定
dbFullPath = ThisWorkbook.Path & "\staff_records.accdb"
' DAO エンジン生成とデータベース接続
Set daoObj = CreateObject("DAO.DBEngine.120")
Set accDB = daoObj.OpenDatabase(dbFullPath)
' パラメータクエリ (qry_staff_invoice) を取得
Set qdParam = accDB.QueryDefs("qry_staff_invoice")
' パラメータを設定
qdParam.Parameters("PleaseEnterStaffName") = "Rintaro Mori"
' クエリ結果をレコードセットに格納
Set rsResult = qdParam.OpenRecordset
' 列名を 1 行目・列 H から書き込み
For colIdx = 0 To rsResult.Fields.Count - 1
Sheet1.Cells(1, colIdx + 8).Value = rsResult.Fields(colIdx).Name
Next colIdx
' データ本体を 2 行目・列 H から書き込み
Sheet1.Range("H2").CopyFromRecordset rsResult
' 後始末
rsResult.Close
qdParam.Close
accDB.Close
End Sub
コードのポイント
- DAO を動的生成
CreateObject("DAO.DBEngine.120")
により、VBE の参照設定なしで DAO 12.0 を利用できます。 - QueryDef の取得とパラメータ設定
QueryDefs("qry_staff_invoice")
でクエリを呼び出し、Parameters("PleaseEnterStaffName")
に値を渡します。 - 列名の出力
Cells(1, 8)
(列 H1)からフィールド名を書き込むことで、ヘッダー行を自動生成しています。 - 結果の貼り付け
CopyFromRecordset
を使用することで、データを一括で貼り付けられます。
カスタマイズ例
用途 | 修正箇所 |
---|---|
別のパラメータ名を使用する | Parameters("…") を該当名に変更 |
複数パラメータを渡す | パラメータ行を追加し、順に値を設定 |
貼り付け開始セルを変更 | Cells と Range の列・行番号を編集 |
DAO バージョンを切り替え | 64 ビット Office 等で動作しない場合は DBEngine.140 などへ変更 |
まとめ
パラメータクエリと DAO を組み合わせることで、Excel から柔軟に Access データを抽出できます。列名付き出力により、後続の集計や分析もスムーズに行えます。定期レポートやダッシュボードの自動更新にぜひご活用ください。