Excel VBA から Access の パススルークエリ(Pass-Through Query) を使って MySQL データベースの更新 を行うには、以下のステップで実現可能です。
目次
🔧 全体の流れ
- Access ファイル(.accdb)にパススルークエリを作成
- そのパススルークエリに MySQL 接続文字列を設定
- Excel VBA から Access を操作してそのクエリを実行
🏗 1. Access でパススルークエリを作成(手動)
- Access を開く
- クエリデザイン → SQLビューに切り替え
- 以下のように SQL を記述(例):
UPDATE your_table SET your_column = 'value' WHERE id = 123;
- クエリのプロパティで:
- ODBC接続文字列 を設定(例):
ODBC;DRIVER={MySQL ODBC 8.0 ANSI Driver};SERVER=localhost;DATABASE=testdb;USER=root;PASSWORD=yourpass;
- クエリに名前をつけて保存(例:
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 = False
:UPDATE/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文がそのまま使えます。
- 出力形式やセル書式を調整したい場合もカスタマイズ可能です。