目次
Access VBA Mysql のテーブルをインポートする
Access VBAでMySQLのテーブルをインポートするプロシジャーを作成するには、以下のような構成が一般的です:
- MySQL ODBCドライバを使用してDSN(またはDSNレス)接続を確立
- MySQLのテーブルをAccessにリンクまたはインポート
以下は、MySQLのテーブルをAccessのローカルテーブルにインポートするサンプルVBAプロシージャです。
🔧 Access VBA: MySQLテーブルをインポートするプロシージャ(DSNレス)
Sub ImportMySQLTable()
Dim conn As Object
Dim strConnect As String
Dim strSQL As String
Dim rst As Object
Dim db As DAO.Database
Dim tblName As String
Dim mysqlTable As String
' Access側のテーブル名
tblName = "Imported_MySQL_Table"
' MySQL側のテーブル名
mysqlTable = "your_mysql_table"
' DSNレス接続文字列(MySQL ODBC 8.0 ドライバ使用例)
strConnect = "Driver={MySQL ODBC 8.0 ANSI Driver};" & _
"Server=your_server_address;" & _
"Database=your_database;" & _
"User=your_user;" & _
"Password=your_password;" & _
"Option=3;"
' ADO接続を作成
Set conn = CreateObject("ADODB.Connection")
conn.Open strConnect
' SQLでMySQLテーブルから全データを取得
strSQL = "SELECT * FROM " & mysqlTable
' ADOレコードセットを開く
Set rst = CreateObject("ADODB.Recordset")
rst.Open strSQL, conn, 1, 3 ' 1 = adOpenKeyset, 3 = adLockOptimistic
' DAOでAccess DBを取得
Set db = CurrentDb
' 既にテーブルが存在する場合、削除
On Error Resume Next
db.TableDefs.Delete tblName
On Error GoTo 0
' レコードセットをAccessにインポート
DoCmd.TransferDatabase acImport, "ODBC Database", strConnect, _
acTable, mysqlTable, tblName, False
' 後始末
rst.Close
conn.Close
Set rst = Nothing
Set conn = Nothing
Set db = Nothing
MsgBox "インポートが完了しました: " & tblName
End Sub
🔍 注意点:
- ODBCドライバ:MySQL ODBCドライバ(例: 8.0 ANSI/Unicode)がインストールされている必要があります。
- ODBCの設定:上記はDSNレス接続です。DSNを使いたい場合は
"ODBC;DSN=your_dsn_name;"を使ってください。 - テーブルの既存確認・削除:テーブルが既にあるとエラーになるため、削除処理を入れています。
リンクテーブル作成版
以下は、Access VBAでMySQLのテーブルをリンクテーブルとして作成するプロシジャー(DSNレス接続)のサンプルです。
🔗 Access VBA: MySQLテーブルをリンクするプロシージャ(DSNレス)
Sub LinkMySQLTable()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim strConnect As String
Dim linkedTableName As String
Dim mysqlTableName As String
' Accessで表示するテーブル名
linkedTableName = "Linked_MySQL_Table"
' MySQL側のテーブル名
mysqlTableName = "your_mysql_table"
' DSNレス接続文字列(MySQL ODBC 8.0 ANSI ドライバ)
strConnect = "ODBC;" & _
"Driver={MySQL ODBC 8.0 ANSI Driver};" & _
"Server=your_server;" & _
"Database=your_database;" & _
"User=your_user;" & _
"Password=your_password;" & _
"Option=3;"
' 現在のAccessデータベースを取得
Set db = CurrentDb
' 既存のリンクテーブルがあれば削除
On Error Resume Next
db.TableDefs.Delete linkedTableName
On Error GoTo 0
' 新しくリンクテーブルを作成
Set tdf = db.CreateTableDef(linkedTableName)
tdf.SourceTableName = mysqlTableName
tdf.Connect = strConnect
db.TableDefs.Append tdf
MsgBox "リンクテーブルが作成されました: " & linkedTableName
End Sub
✅ カスタマイズポイント
your_server:MySQLサーバーのホスト名(例:"localhost"、またはIPアドレス)your_database:MySQLのデータベース名your_user/your_password:MySQLログイン情報your_mysql_table:MySQL側の対象テーブル名Linked_MySQL_Table:Accessで表示するリンクテーブル名(任意)
この方法を使えば、Accessの画面上に直接MySQLのテーブルが表示され、Access内からそのまま編集・参照できます(MySQLのユーザー権限に応じて)。
パススルークエリで MySQL からデータを取得し、Access テーブルにインポート
Access VBA で パススルークエリ(Pass-Through Query)を使って MySQL のテーブルを Access にインポートする方法は、以下のように構成できます。これは「Access のクエリオブジェクトを使って MySQL に直接 SQL を送信し、その結果を Access テーブルとして取り込む」方法です。
✅ パススルークエリで MySQL からデータを取得し、Access テーブルにインポート
Sub ImportViaPassThroughQuery()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strConnect As String
Dim strSQL As String
Dim localTableName As String
Set db = CurrentDb
' MySQLに送るSQL
strSQL = "SELECT * FROM 顧客マスタ"
' Accessに作成するローカルテーブル名
localTableName = "t_顧客マスタ"
' DSNレス接続文字列(ODBCドライバ名は環境に合わせて調整)
strConnect = "ODBC;Driver={MySQL ODBC 8.0 Unicode Driver};" & _
"Server=localhost;" & _
"Database=eng001;" & _
"User=db_user;" & _
"Password=db_user;" & _
"Option=3;"
' 既存のクエリがあれば削除
On Error Resume Next
db.QueryDefs.Delete "tmpPassThrough"
On Error GoTo 0
' パススルークエリの作成
Set qdf = db.CreateQueryDef("tmpPassThrough")
qdf.Connect = strConnect
qdf.SQL = strSQL
qdf.ReturnsRecords = True
qdf.ODBCTimeout = 30
' 結果をAccessテーブルとして取り込む
DoCmd.DeleteObject acTable, localTableName ' 既存テーブルを削除(あれば)
DoCmd.TransferDatabase acImport, "ODBC Database", strConnect, _
acQuery, "tmpPassThrough", localTableName, False
MsgBox "MySQLから " & localTableName & " にデータを取り込みました。"
' クエリ定義を削除
db.QueryDefs.Delete "tmpPassThrough"
End Sub
🔍 補足
TransferDatabaseのacQueryを使うことで、パススルークエリからの結果をテーブルとしてインポートできます。ReturnsRecords = Trueを忘れずに指定してください(SELECT文が対象)。- INSERT/UPDATE/DELETE を行う場合は
ReturnsRecords = Falseにします。
パススルークエリで MySQL を UPDATE(更新クエリ)
以下は、**Access VBA から MySQL に対して「パススルークエリで UPDATE を実行する」方法(更新クエリ版)**のサンプルです。これは、MySQL側のデータを直接更新したい場合に便利です。
✅ パススルークエリで MySQL を UPDATE(更新クエリ)
Sub UpdateMySQLViaPassThrough()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strConnect As String
Dim strSQL As String
Set db = CurrentDb
' 更新SQL文(MySQL文法)
strSQL = "UPDATE 顧客マスタ SET 電話番号 = '000-1111-2222' WHERE 顧客ID = 1;"
' DSNレス接続文字列(ODBCドライバの名称は環境により調整)
strConnect = "ODBC;Driver={MySQL ODBC 8.0 Unicode Driver};" & _
"Server=localhost;" & _
"Database=eng001;" & _
"User=db_user;" & _
"Password=db_user;" & _
"Option=3;"
' 既存のクエリ定義があれば削除
On Error Resume Next
db.QueryDefs.Delete "tmpUpdateQuery"
On Error GoTo 0
' パススルークエリの作成
Set qdf = db.CreateQueryDef("tmpUpdateQuery")
qdf.Connect = strConnect
qdf.SQL = strSQL
qdf.ReturnsRecords = False ' 更新クエリはレコードを返さない
qdf.ODBCTimeout = 30
' クエリを実行(レコード数は返されない)
qdf.Execute dbFailOnError
MsgBox "MySQLのレコードを更新しました。"
' 後始末(クエリを削除しておく)
db.QueryDefs.Delete "tmpUpdateQuery"
Set qdf = Nothing
Set db = Nothing
End Sub
🔍 補足
- ReturnsRecords = False:
UPDATE / INSERT / DELETEのような実行系SQLの場合は 必須。 - dbFailOnError:エラー発生時にVBAの
Errで補足可能。 qdf.Executeの前にDebug.Print qdf.SQLを入れると、実行前にSQL確認できます。
✅ INSERT や DELETE にも応用可能!
' INSERT例 strSQL = "INSERT INTO 顧客マスタ (顧客ID, 名前) VALUES (999, 'テスト太郎');" ' DELETE例 strSQL = "DELETE FROM 顧客マスタ WHERE 顧客ID = 999;"
