Access VBA Mysql のテーブルをインポートする

目次

Access VBA Mysql のテーブルをインポートする

Access VBAでMySQLのテーブルをインポートするプロシジャーを作成するには、以下のような構成が一般的です:

  1. MySQL ODBCドライバを使用してDSN(またはDSNレス)接続を確立
  2. 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

🔍 補足

  • TransferDatabaseacQuery を使うことで、パススルークエリからの結果をテーブルとしてインポートできます。
  • 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 = FalseUPDATE / 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;"

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