access-vba-PassThrough-query

Access VBAからMySQLに接続するには、ODBC(Open Database Connectivity)ドライバを利用して接続するのが一般的です。以下に手順とコードのサンプルを紹介します。


目次

✅ 必要な準備

  1. MySQL ODBCドライバをインストール
    • 「MySQL Connector/ODBC」をMySQL公式サイトからダウンロード・インストールしてください。
    • 32bit版または64bit版は、Accessのバージョンと一致させる必要があります。
  2. ODBCデータソースの設定(任意)
    • 「ODBC データ ソース アドミニストレーター」で「ユーザーDSN」または「システムDSN」を設定してもいいですが、VBAでDSN-less接続も可能です。

✅ VBAコード例(DSN-less接続)

Sub ConnectToMySQL()
    Dim conn As Object
    Dim rs As Object
    Dim connStr As String
    Dim sql As String

    ' Create the connection object
    Set conn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")

    ' 接続文字列の例(適宜変更)
    connStr = "Driver={MySQL ODBC 8.0 ANSI Driver};" & _
              "Server=localhost;" & _
              "Database=your_database;" & _
              "User=your_username;" & _
              "Password=your_password;" & _
              "Option=3;"

    ' 接続
    On Error GoTo errHandler
    conn.Open connStr

    ' データ取得の例
    sql = "SELECT * FROM your_table"
    rs.Open sql, conn

    ' 結果の表示
    Do Until rs.EOF
        Debug.Print rs.Fields(0).Value
        rs.MoveNext
    Loop

    ' クローズ
    rs.Close
    conn.Close
    Set rs = Nothing
    Set conn = Nothing
    Exit Sub

errHandler:
    MsgBox "接続エラー: " & Err.Description
End Sub

✅ 注意点

  • ドライバ名Driver={MySQL ODBC 8.0 ANSI Driver})は、実際にインストールされたバージョンに合わせてください。Unicode版を使うなら MySQL ODBC 8.0 Unicode Driver に変更。
  • VBAでADOを使う場合、Microsoft ActiveX Data Objectsライブラリ(2.x) を「ツール」→「参照設定」で有効にしておくと便利です(CreateObjectを使わない書き方が可能になります)。

クエリのパラメータ化

Access VBAでMySQLに接続してパラメータ付きクエリを安全に実行するには、ADODB.Command オブジェクトを使うのが一般的です。これによりSQLインジェクション対策にもなります。


✅ パラメータ付きクエリの例(SELECT文)

Sub ParameterizedQuery()
    Dim conn As Object
    Dim cmd As Object
    Dim rs As Object
    Dim connStr As String
    Dim sql As String

    ' 接続文字列(例)
    connStr = "Driver={MySQL ODBC 8.0 ANSI Driver};" & _
              "Server=localhost;" & _
              "Database=your_database;" & _
              "User=your_username;" & _
              "Password=your_password;" & _
              "Option=3;"

    ' SQL文(? はパラメータプレースホルダ)
    sql = "SELECT * FROM users WHERE username = ? AND age > ?"

    ' オブジェクト生成
    Set conn = CreateObject("ADODB.Connection")
    Set cmd = CreateObject("ADODB.Command")

    ' 接続オープン
    conn.Open connStr

    ' コマンド設定
    With cmd
        .ActiveConnection = conn
        .CommandText = sql
        .CommandType = 1 ' adCmdText

        ' パラメータの追加(位置順)
        .Parameters.Append .CreateParameter("username", 200, 1, 50, "john") ' 200 = adVarChar, 1 = adParamInput
        .Parameters.Append .CreateParameter("age", 3, 1, , 25) ' 3 = adInteger
    End With

    ' クエリ実行
    Set rs = cmd.Execute

    ' 結果表示
    Do Until rs.EOF
        Debug.Print rs.Fields("username").Value
        rs.MoveNext
    Loop

    ' クローズ処理
    rs.Close: conn.Close
    Set rs = Nothing: Set cmd = Nothing: Set conn = Nothing
End Sub

✅ パラメータ型の主な一覧

データ型定数値説明
adVarChar200文字列
adInteger3整数
adDouble5実数
adDate7日付(Date型)
adBoolean11真偽値

✅ 注意点

  • パラメータは 順番が重要(名前ではなく順番で渡される)。
  • MySQL ODBC ドライバは @param 形式ではなく ? プレースホルダのみ対応。
  • CommandType = 1adCmdText の意味。

insert文でのパラメータ例

Access VBA から MySQL に対して INSERT文をパラメータ付きで実行するには、ADODB.Command オブジェクトを使って、値をバインドして送信するのが安全かつ確実な方法です。


✅ INSERT文でのパラメータ使用例

以下の例は、users テーブルに username(文字列)と age(整数)を挿入するケースです。

Sub InsertWithParameters()
    Dim conn As Object
    Dim cmd As Object
    Dim connStr As String
    Dim sql As String

    ' 接続文字列(環境に合わせて変更)
    connStr = "Driver={MySQL ODBC 8.0 ANSI Driver};" & _
              "Server=localhost;" & _
              "Database=your_database;" & _
              "User=your_username;" & _
              "Password=your_password;" & _
              "Option=3;"

    ' INSERT文(プレースホルダ ? を使用)
    sql = "INSERT INTO users (username, age) VALUES (?, ?)"

    ' オブジェクトの作成
    Set conn = CreateObject("ADODB.Connection")
    Set cmd = CreateObject("ADODB.Command")

    ' 接続オープン
    conn.Open connStr

    ' コマンド設定
    With cmd
        .ActiveConnection = conn
        .CommandText = sql
        .CommandType = 1 ' adCmdText

        ' パラメータの追加(順番に注意)
        .Parameters.Append .CreateParameter("username", 200, 1, 50, "taro")  ' adVarChar
        .Parameters.Append .CreateParameter("age", 3, 1, , 30)               ' adInteger
    End With

    ' クエリ実行
    cmd.Execute

    ' 終了処理
    conn.Close
    Set cmd = Nothing
    Set conn = Nothing

    MsgBox "データを挿入しました。"
End Sub

✅ 補足情報

  • CreateParameter の第2引数(型)は ADODB 型定数(例: adVarChar = 200, adInteger = 3)。
  • 第3引数 adParamInput = 1 は「入力用パラメータ」の意味。
  • MySQL 側のカラム定義と一致するよう、長さ(50など)を調整してください。

update文のサンプル

こちらは、Access VBA から MySQL に対して パラメータ付き UPDATE文 を実行するサンプルです。


✅ UPDATE文(パラメータ使用)の例

たとえば、users テーブルで特定のユーザー名に対して年齢を更新する処理:

Sub UpdateWithParameters()
    Dim conn As Object
    Dim cmd As Object
    Dim connStr As String
    Dim sql As String

    ' 接続文字列(環境に応じて修正)
    connStr = "Driver={MySQL ODBC 8.0 ANSI Driver};" & _
              "Server=localhost;" & _
              "Database=your_database;" & _
              "User=your_username;" & _
              "Password=your_password;" & _
              "Option=3;"

    ' UPDATE文(パラメータは ? を使用)
    sql = "UPDATE users SET age = ? WHERE username = ?"

    ' オブジェクト生成
    Set conn = CreateObject("ADODB.Connection")
    Set cmd = CreateObject("ADODB.Command")

    ' 接続オープン
    conn.Open connStr

    ' コマンド構築
    With cmd
        .ActiveConnection = conn
        .CommandText = sql
        .CommandType = 1 ' adCmdText

        ' パラメータの追加(順番が重要)
        .Parameters.Append .CreateParameter("age", 3, 1, , 35)                  ' adInteger
        .Parameters.Append .CreateParameter("username", 200, 1, 50, "taro")     ' adVarChar
    End With

    ' 実行
    cmd.Execute

    ' 終了処理
    conn.Close
    Set cmd = Nothing
    Set conn = Nothing

    MsgBox "更新が完了しました。"
End Sub

✅ よくある用途・注意点

  • UPDATE ... SET col1 = ?, col2 = ? WHERE id = ? のように複数カラムを更新する場合も同様に順番でパラメータをバインドします。
  • CommandType を明示的に 1(= adCmdText)にすること。
  • 文字列には adVarChar (200)、数値には adInteger (3)、日付には adDate (7) を使います。

日付型のinsert例

Access VBA から MySQL に 日付型(DATE型や DATETIME型)を含むデータを INSERT するには、ADODB.Command でパラメータ型を adDate(=7)として指定します。


✅ 日付型を含む INSERT 文のサンプル

例:events テーブルに title(文字列)と event_date(日付)を挿入する。

Sub InsertDateExample()
    Dim conn As Object
    Dim cmd As Object
    Dim connStr As String
    Dim sql As String
    Dim eventDate As Date

    ' サンプル日付
    eventDate = #6/7/2025#  ' VBAの日付リテラル形式(MM/DD/YYYY)

    ' 接続文字列(MySQLに合わせて修正)
    connStr = "Driver={MySQL ODBC 8.0 ANSI Driver};" & _
              "Server=localhost;" & _
              "Database=your_database;" & _
              "User=your_username;" & _
              "Password=your_password;" & _
              "Option=3;"

    ' INSERT 文
    sql = "INSERT INTO events (title, event_date) VALUES (?, ?)"

    ' オブジェクト生成
    Set conn = CreateObject("ADODB.Connection")
    Set cmd = CreateObject("ADODB.Command")

    ' 接続開始
    conn.Open connStr

    ' コマンド設定
    With cmd
        .ActiveConnection = conn
        .CommandText = sql
        .CommandType = 1 ' adCmdText

        ' パラメータ追加
        .Parameters.Append .CreateParameter("title", 200, 1, 100, "展示会2025")  ' adVarChar
        .Parameters.Append .CreateParameter("event_date", 7, 1, , eventDate)     ' adDate
    End With

    ' 実行
    cmd.Execute

    ' 終了処理
    conn.Close
    Set cmd = Nothing
    Set conn = Nothing

    MsgBox "イベントを登録しました。"
End Sub

✅ 補足

  • adDate = 7 を使用すると、DATEDATETIME に対応。
  • VBA の Date 型で #6/7/2025# のようにリテラルで書くか、DateSerial/CDate を使って構築できます。
  • MySQL 側のカラムが DATETIME 型でも、問題なく渡せます。

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