Access に保存されたクエリやテーブルから、SQL 文で抽出条件を指定してデータを取得する手順をご紹介いたします。DAO(Data Access Objects)を使用し、参照設定なしで実行できるサンプルコードを掲載いたします。
目次
サンプルコード
Sub GetDataBySQL()
Dim daoEngine As Object ' DAO エンジン
Dim accessCon As Object ' Access DB 接続
Dim rsInvoice As Object ' レコードセット
Dim sqlStmt As String ' SQL 文
Dim colNum As Long ' 列ループ用
Dim dbPath As String ' DB パス
' Access ファイルのフルパス
dbPath = ThisWorkbook.Path & "\invoice_db.accdb"
' DAO エンジンとデータベースの初期化
Set daoEngine = CreateObject("DAO.DBEngine.120")
Set accessCon = daoEngine.OpenDatabase(dbPath)
' SQL 文を定義(InvoiceID = 17 のみ抽出)
sqlStmt = "SELECT * FROM qry_invoice_list WHERE InvoiceID = 17"
' レコードセットを取得
Set rsInvoice = accessCon.OpenRecordset(sqlStmt)
' 列名をセル K1 から出力
For colNum = 0 To rsInvoice.Fields.Count - 1
Sheet1.Cells(1, colNum + 11).Value = rsInvoice.Fields(colNum).Name
Next colNum
' データ本体を K2 から貼り付け
Sheet1.Range("K2").CopyFromRecordset rsInvoice
' 後処理
rsInvoice.Close
accessCon.Close
End Sub
コードのポイント
項目 | 説明 |
---|---|
DAO を動的生成 | CreateObject("DAO.DBEngine.120") により、参照設定を行わずに DAO 12.0 を呼び出します。 |
SQL 文 | sqlStmt 変数に SELECT 文を直接記述し、抽出条件を指定します。テーブル名・フィールド名は実環境に合わせて変更してください。 |
列名の自動出力 | Cells(1, 11) で列 K1 からフィールド名を書き込み、ヘッダー行を自動生成しています。 |
CopyFromRecordset | 取得したデータをセル K2 以降へ一括貼り付けします。 |
カスタマイズ例
目的 | 変更箇所 |
---|---|
抽出条件を動的に指定 | InvoiceID = 17 を変数やフォーム入力に置き換える |
別シートに貼り付け | Sheet1 を Worksheets("Target") などに変更 |
特定列のみ取得 | SELECT InvoiceID, Total, CustomerName FROM ... と列を限定 |
64 ビット Office 対応 | DAO.DBEngine.120 で動作しない場合は DBEngine.140 へ変更 |
トラブルシューティング
- SQL 文のスペルミス
WHERE
などのキーワードに誤字があるとエラーになります。特に大文字小文字は区別されませんが、語句が正しく記述されているかご確認ください。 - フィールド名の誤り
Access 側の列名が変更されていると取得できません。必ず最新の列名を指定してください。
まとめ
Excel VBA から SQL 文を直接実行することで、Access から必要なデータだけをピンポイントで取得できます。列名を自動で取得し、Excel に貼り付ければ、そのまま分析や集計に活用可能です。レポートの自動化やデータ抽出の効率化にぜひご活用ください。