目次
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;"