Excel VBA と SQL で Access データを読み込む方法

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 を変数やフォーム入力に置き換える
別シートに貼り付けSheet1Worksheets("Target") などに変更
特定列のみ取得SELECT InvoiceID, Total, CustomerName FROM ... と列を限定
64 ビット Office 対応DAO.DBEngine.120 で動作しない場合は DBEngine.140 へ変更

トラブルシューティング

  • SQL 文のスペルミス
    WHERE などのキーワードに誤字があるとエラーになります。特に大文字小文字は区別されませんが、語句が正しく記述されているかご確認ください。
  • フィールド名の誤り
    Access 側の列名が変更されていると取得できません。必ず最新の列名を指定してください。

まとめ

Excel VBA から SQL 文を直接実行することで、Access から必要なデータだけをピンポイントで取得できます。列名を自動で取得し、Excel に貼り付ければ、そのまま分析や集計に活用可能です。レポートの自動化やデータ抽出の効率化にぜひご活用ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次