AccessからMySQLのテーブルを取得する

目次

AccessからMySQLのテーブルを取得する

MySql community

MySQL Community Editionは、世界で最も多く使用されているオープンソース・データベースの、無償で自由にダウンロードして利用することができるバージョンです。

GPLライセンスに従って利用することができ、多くのオープンソース・デベロッパーが参加する、巨大で活発なコミュニティによるサポートを享受することができます。

https://www.mysql.com/jp/products/community

MySQL Connector/ODBC

1. 必要な準備

1-1. MySQL Connector/ODBCのインストール

1.MySQL Connector/ODBCをダウンロードしてインストールします。

1.インストール後、Windowsの「ODBC Data Source Administrator」でMySQLへの接続を設定できます。

MySQL Connector/ODBC

https://dev.mysql.com/downloads/connector/odbc

1-2. MySQLの接続情報を確認

•サーバーアドレス(例: localhost または IP アドレス)

•ポート番号(デフォルトは 3306)

•データベース名(例: testdb)

•ユーザー名とパスワード

DAO … Data Access Objects

1.VBAエディタを開く(Alt + F11)。

2.**[ツール] → [参照設定]**を選択。

3.Microsoft Office XX.X Access Database Engine Object Library(最新バージョン)をチェック。

4.古い DAO 3.6 がチェックされている場合は、そのチェックを外す。

ADO … ActiveX Data Object

1.1 ADOライブラリの参照設定

ADOを使用するには、プロジェクトで参照設定を行う必要があります。

1.VBAエディタを開く(Alt + F11)。

2.メニューから [ツール] > [参照設定] を選択。

3.Microsoft ActiveX Data Objects x.x Library にチェックを入れる

  (x.x はバージョン、一般的には最新の「6.1」がおすすめ)。

4.[OK]をクリック。

接続文字列 MySQL 基本構文

Driver={MySQL ODBC 8.0 Unicode Driver};
Server=[サーバーアドレス] ;
Database=[データベース名] ;
User=[ユーザー名] ;
Password=[パスワード] ;
Option=[オプション];"

接続テスト

MySQLへの接続テスト

Option Compare Database
'CursorTypeEnum(カーソルタイプ)
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3
'ロックタイプ
Const adLockReadOnly = 1
Const adLockPessimistic = 2
Const adLockOptimistic = 3
Const adLockBatchOptimistic = 4
ErrHandler:<br>Debug.Print "エラーが発生しましSub mysql_connect_Test()
  Dim ado As Object ' ADO Connectionオブジェクト
  Dim res As Object ' ADO Recordsetオブジェクト
  Dim strDsn As String
  ' 接続用DSN(ここでMySQLサーバー情報を設定)
    strDsn = ""
    strDsn = strDsn + "Driver={MySQL ODBC 8.0 Unicode Driver};"
    strDsn = strDsn + "Server=localhost;" ' サーバーアドレス
    strDsn = strDsn + "Database=eng001;" ' データベース名
    strDsn = strDsn + "User=db_user;"     ' ユーザー名
    strDsn = strDsn + "Password=db_user;" ' ユーザーバスワード
    strDsn = strDsn + "Option=3;"
  Debug.Print strDsn
  On Error GoTo ErrHandler  ' エラー処理開始
  Set ado = CreateObject("ADODB.Connection")
      ado.Open strDsn
        If ado.State = 1 Then Debug.Print "接続成功!!"; ado.State
        ' ここに 処理を記述する
      ado.Close
  Set ado = Nothing
  Exit Sub
  
ErrHandler:
    Debug.Print "エラーが発生しました: " & Err.Description
    If Not ado Is Nothing Then
        If ado.State = 1 Then ado.Close
        Set ado = Nothing
    End If
End Sub
た: " &amp; Err.Description<br>If Not ado Is Nothing Then<br>If ado.State = 1 Then ado.Close<br>Set ado = Nothing<br>End If<br>End Sub

テーブル一覧の取得

Function ado_Dsn_MySql() As String
  Dim strDsn As String
  strDsn = ""
  strDsn = strDsn + "Driver={MySQL ODBC 8.0 Unicode Driver};"
  strDsn = strDsn + "Server=localhost;"
  strDsn = strDsn + "Database=eng001;"
  strDsn = strDsn + "User=db_user;"
  strDsn = strDsn + "Password=db_user;"
  strDsn = strDsn + "Option=19;"
  ado_Dsn_MySql = strDsn
End Function
Sub sql_GetTableList()
    Dim ado As Object  ' ADO Connection
    Dim res As Object  ' ADO Recordset
    Dim strDsn As String
    Dim strSQL As String
    
    Debug.Print "テーブル一覧"
    strDsn = ado_Dsn_MySql()
    On Error GoTo ErrHandler
    Set ado = CreateObject("ADODB.Connection") ' ADO接続作成
        ado.Open strDsn ' mySQLに接続
    
        strSQL = "SHOW TABLES;" ' テーブル一覧を取得するSQL
        Set res = ado.Execute(strSQL) ' クエリ実行
        
        Do Until res.EOF ' テーブル名をDebug出力
            Debug.Print res.Fields(0).Value
            res.MoveNext
        Loop
        ado.Close: Set ado = Nothing
  Exit Sub

ErrHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbExclamation, "エラー"
    On Error Resume Next
    If Not res Is Nothing Then
        If res.State = 1 Then res.Close
        Set res = Nothing
    End If
    If Not ado Is Nothing Then
        If ado.State = 1 Then ado.Close
        Set ado = Nothing
    End If
End Sub

テーブルの検索

Sub ado_Select_Table()
    Dim ado As Object ' ADO Connectionオブジェクト
    Dim res As Object ' ADO Recordsetオブジェクト
    Dim strDsn, strSQL As String
    Dim i As Integer
    
    strDsn = ado_Dsn_MySql() ' 接続文字列の取得
    strSQL = "SELECT * FROM 顧客マスタ" ' 実行するSQL文の作成

    Set ado = CreateObject("ADODB.Connection")  ' ADO オブジェクトの作成
        ado.Open strDsn                         'データベースへの接続
    Set res = CreateObject("ADODB.Recordset")   'レコードセットの作成
        res.Open strSQL, ado, adOpenKeyset, adLockReadOnly
    
    On Error GoTo ErrorHandler
    ' データを表示
    For i = 0 To res.Fields.Count - 1   ' ヘッダーを書き込む
        Debug.Print res.Fields(i).Name & ":";
    Next i
    Debug.Print
    
    While Not res.EOF
        For i = 0 To res.Fields.Count - 1
            Debug.Print res.Fields(i).Value & ":";
        Next i
        res.MoveNext
        Debug.Print
    Wend
    res.Close: Set res = Nothing ' 終了処理
    ado.Close: Set ado = Nothing
    Exit Sub

ErrorHandler:
    MsgBox "エラー: " & Err.Description
    If Not res Is Nothing Then
        If res.State = 1 Then res.Close
        Set res = Nothing
    End If
    If Not ado Is Nothing Then
        If ado.State = 1 Then ado.Close
        Set ado = Nothing
    End If
    Set ws = Nothing
End Sub

テーブルのインポート

Sub ImportMySQLTable_ODBC()
    Dim conn As Object
    Dim strConnect_ado As String
    Dim strConnect_dao As String
    Dim strSQL As String
    Dim rst As Object
    Dim db As DAO.Database
    Dim tblName As String
    Dim mysqlTable As String

    tblName = "import_顧客マスタ" ' Access側のテーブル名
    mysqlTable = "顧客マスタ" ' MySQL側のテーブル名

    strConnect_ado = ado_Dsn_MySql()            ' 接続文字列(MySQL ODBC 8.0 ドライバ使用例)
    strConnect_dao = "ODBC;" & strConnect_ado
    
    Set conn = CreateObject("ADODB.Connection") ' ADO接続を作成
        conn.Open strConnect_ado
        strSQL = "SELECT * FROM " & mysqlTable  ' SQLでMySQLテーブルから全データを取得
    Set rst = CreateObject("ADODB.Recordset")   ' ADOレコードセットを開く
        rst.Open strSQL, conn, 1, 3             ' 1 = adOpenKeyset, 3 = adLockOptimistic

    Set db = CurrentDb ' DAOでAccess DBを取得
    On Error Resume Next ' 既にテーブルが存在する場合、削除
    db.TableDefs.Delete tblName
    On Error GoTo 0
    ' レコードセットをAccessにインポート
    DoCmd.TransferDatabase acImport, "ODBC Database", strConnect_dao, _
                           acTable, mysqlTable, tblName, False
    rst.Close: Set rst = Nothing ' 後始末
    conn.Close:  Set conn = Nothing
    Set db = Nothing
    MsgBox "インポートが完了しました: " & tblName
End Sub

リンクテーブルによる更新

Sub create_LinkTable_mysql()
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim strConnect As String
    Dim linkedTableName As String
    Dim mysqlTableName As String

    linkedTableName = "Linked_顧客マスタ"    ' Accessで表示するテーブル名
    mysqlTableName = "顧客マスタ"            ' MySQL側のテーブル名

    strConnect = dao_Dsn_MySql() ' 接続文字列(MySQL ODBC 8.0 ANSI ドライバ)
    
    Set db = CurrentDb ' 現在のAccessデータベースを取得

    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
よかったらシェアしてね!
目次