Access のクエリ(例:qry_invoice_list
)を Excel に自動転送したい場合、DAO(Data Access Objects)を用いるとシンプルに実装できます。本記事では「列名も含めて貼り付ける」処理に焦点を当て、参照設定不要で動作するコードをご紹介いたします。
目次
サンプルコード
Sub ImportQueryWithHeaders()
Dim daoEngine As Object ' DAO エンジン
Dim dbConnect As Object ' Access DB 接続
Dim rsQuery As Object ' クエリ結果
Dim headerCol As Long ' ヘッダー用ループ変数
Dim accdbPath As String ' データベース パス
' Access ファイルのフルパスを設定
accdbPath = ThisWorkbook.Path & "\sales_report.accdb"
' DAO エンジン生成とデータベース接続
Set daoEngine = CreateObject("DAO.DBEngine.120")
Set dbConnect = daoEngine.OpenDatabase(accdbPath)
' クエリ(qry_invoice_list)をレコードセットとして取得
Set rsQuery = dbConnect.OpenRecordset("qry_invoice_list")
' 列名を書き込む(開始セル F1)
For headerCol = 0 To rsQuery.Fields.Count - 1
Sheet1.Cells(1, headerCol + 6).Value = rsQuery.Fields(headerCol).Name
Next headerCol
' データを書き込む(F2 以降)
Sheet1.Range("F2").CopyFromRecordset rsQuery
' 後始末
rsQuery.Close
dbConnect.Close
End Sub
コード解説
項目 | 説明 |
---|---|
CreateObject("DAO.DBEngine.120") | DAO 12.0 を動的に呼び出しますので、参照設定は不要です。 |
OpenDatabase(accdbPath) | 変数 accdbPath に格納した .accdb を開きます。 |
OpenRecordset("qry_invoice_list") | Access 側で作成済みのクエリ名を指定します。 |
ヘッダーの出力 | Cells(1, 6) (セル F1)からフィールド名を書き込みます。 |
データの出力 | CopyFromRecordset により、セル F2 から一括貼り付けします。 |
カスタマイズのポイント
- クエリ名の変更
Access で使用しているクエリ名に合わせてqry_invoice_list
を変更してください。 - 貼り付け先セルの調整
列や行を変更する場合はCells
とRange
の位置を編集します。 - 64 ビット Office での DAO バージョン
DAO.DBEngine.120
が動かない場合はDBEngine.140
などに置き換えてお試しください。
応用例
- パラメータ付きクエリの取り込み
SQL 文を直接指定して、期間や担当者で絞り込んだ結果を読み込むことも可能です。
例: vbaコピーする編集するSet rsQuery = dbConnect.OpenRecordset( _ "SELECT * FROM qry_invoice_list WHERE SaleDate >= Date() - 30")
- 複数シートへの自動出力
シートを動的に追加し、月別・担当者別などに分けてデータを貼り付けることで、自動レポート作成が効率化されます。
まとめ
Excel VBA と DAO を組み合わせることで、Access クエリの結果を列名付きで簡単に取り込むことができます。定期レポートやダッシュボード作成の自動化に活用していただければ、作業時間を大幅に短縮できます。