Excel VBA から Access の パススルークエリ(Pass-Through Query) を使って MySQL データベースの更新

Excel VBA から Access の パススルークエリ(Pass-Through Query) を使って MySQL データベースの更新 を行うには、以下のステップで実現可能です。


目次

🔧 全体の流れ

  1. Access ファイル(.accdb)にパススルークエリを作成
  2. そのパススルークエリに MySQL 接続文字列を設定
  3. Excel VBA から Access を操作してそのクエリを実行

🏗 1. Access でパススルークエリを作成(手動)

  1. Access を開く
  2. クエリデザイン → SQLビューに切り替え
  3. 以下のように SQL を記述(例):
UPDATE your_table SET your_column = 'value' WHERE id = 123;
  1. クエリのプロパティで:
    • ODBC接続文字列 を設定(例):
ODBC;DRIVER={MySQL ODBC 8.0 ANSI Driver};SERVER=localhost;DATABASE=testdb;USER=root;PASSWORD=yourpass;
  1. クエリに名前をつけて保存(例:qryUpdateMySQL

🧩 2. Excel VBA から Access のクエリを実行

以下は VBA のサンプルコードです:

Sub RunAccessPassThroughQuery()
    Dim accessApp As Object
    Dim accDBPath As String

    accDBPath = "C:\path\to\your\accessfile.accdb" ' Accessファイルのパス

    ' Accessアプリケーションを起動
    Set accessApp = CreateObject("Access.Application")
    accessApp.OpenCurrentDatabase accDBPath

    ' パススルークエリを実行
    accessApp.DoCmd.OpenQuery "qryUpdateMySQL"

    ' 終了処理
    accessApp.Quit
    Set accessApp = Nothing

    MsgBox "MySQLデータが更新されました。"
End Sub

💡 補足事項

  • MySQL ODBC ドライバがインストールされている必要があります。
  • パススルークエリ内の SQL は MySQL の構文で書く必要があります(Access SQLではありません)。
  • 接続文字列の設定は VBA からでも可能です(クエリ定義にアクセスして Connect プロパティを変更)。

vbaでパススルークエリを動的に作成

Excel VBA から Access の パススルークエリを動的に作成・実行する方法 を紹介します。これは、事前にAccessでクエリを作らず、VBA内で直接作成・接続・SQL実行できる柔軟な方法です。


🔧 VBAコード例:Accessでパススルークエリを作成・実行

Sub CreateAndRunPassThroughQuery()
    Dim accApp As Object
    Dim dbPath As String
    Dim qdf As Object
    Dim queryName As String
    Dim sqlText As String
    Dim connectStr As String

    ' Accessファイルのパス
    dbPath = "C:\path\to\your\database.accdb"
    
    ' クエリ名とSQL文
    queryName = "TempPassThroughQuery"
    sqlText = "UPDATE your_table SET your_column = 'new_value' WHERE id = 123;"
    
    ' MySQL用のODBC接続文字列(ドライバ名は環境により変更)
    connectStr = "ODBC;DRIVER={MySQL ODBC 8.0 ANSI Driver};" & _
                 "SERVER=localhost;DATABASE=testdb;UID=root;PWD=yourpass;"

    ' Access起動
    Set accApp = CreateObject("Access.Application")
    accApp.OpenCurrentDatabase dbPath

    On Error Resume Next
    ' すでにクエリが存在していれば削除
    accApp.CurrentDb.QueryDefs.Delete queryName
    On Error GoTo 0

    ' パススルークエリの作成
    Set qdf = accApp.CurrentDb.CreateQueryDef(queryName)
    qdf.Connect = connectStr
    qdf.SQL = sqlText
    qdf.ReturnsRecords = False ' ← SELECTの場合は True
    qdf.Close

    ' 実行
    accApp.DoCmd.OpenQuery queryName

    ' クエリ削除(不要なら残しても可)
    accApp.CurrentDb.QueryDefs.Delete queryName

    ' 終了
    accApp.Quit
    Set accApp = Nothing

    MsgBox "クエリ実行が完了しました。"
End Sub

✅ ポイント

  • ReturnsRecords = FalseUPDATE/INSERT/DELETE などの更新系なら False。SELECT の場合は True。
  • DRIVER={...} は ODBC ドライバに合わせて変更してください(Unicode版を使うなら {MySQL ODBC 8.0 Unicode Driver})。
  • クエリは一時的に作成され、実行後に削除しています(用途によっては残してもOK)。

select結果をexcelに出力

Access のパススルークエリで MySQL から SELECT した結果を Excel シートに出力する VBAコード を以下に示します。


✅ Excel VBA:SELECT 結果を Excel に出力

Sub RunPassThroughQueryAndExportToExcel()
    Dim accApp As Object
    Dim dbPath As String
    Dim qdf As Object
    Dim rst As Object
    Dim sqlText As String
    Dim connectStr As String
    Dim ws As Worksheet
    Dim i As Long

    ' 出力先のワークシート
    Set ws = ThisWorkbook.Sheets("Sheet1") ' 適宜変更

    ' Accessファイルのパス
    dbPath = "C:\path\to\your\database.accdb"

    ' SQL文と接続文字列(必要に応じて変更)
    sqlText = "SELECT id, name FROM your_table WHERE your_column = 'value';"
    connectStr = "ODBC;DRIVER={MySQL ODBC 8.0 ANSI Driver};" & _
                 "SERVER=localhost;DATABASE=testdb;UID=root;PWD=yourpass;"

    ' Access起動
    Set accApp = CreateObject("Access.Application")
    accApp.OpenCurrentDatabase dbPath

    ' 一時クエリの作成
    On Error Resume Next
    accApp.CurrentDb.QueryDefs.Delete "TempSelectQuery"
    On Error GoTo 0

    Set qdf = accApp.CurrentDb.CreateQueryDef("TempSelectQuery")
    qdf.Connect = connectStr
    qdf.SQL = sqlText
    qdf.ReturnsRecords = True

    ' レコードセットの取得
    Set rst = qdf.OpenRecordset()

    ' 結果をワークシートに書き出す(ヘッダー)
    For i = 0 To rst.Fields.Count - 1
        ws.Cells(1, i + 1).Value = rst.Fields(i).Name
    Next i

    ' データ行
    i = 2
    Do While Not rst.EOF
        Dim j As Long
        For j = 0 To rst.Fields.Count - 1
            ws.Cells(i, j + 1).Value = rst.Fields(j).Value
        Next j
        i = i + 1
        rst.MoveNext
    Loop

    ' 後始末
    rst.Close
    Set rst = Nothing
    accApp.CurrentDb.QueryDefs.Delete "TempSelectQuery"
    accApp.Quit
    Set accApp = Nothing

    MsgBox "データの抽出が完了しました。"
End Sub

📝 補足

  • 実行前にワークシート(例:Sheet1)が存在している必要があります。
  • パススルークエリなので、MySQL のSQL文がそのまま使えます。
  • 出力形式やセル書式を調整したい場合もカスタマイズ可能です。

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