Access VBAからMySQLに接続するには、ODBC(Open Database Connectivity)ドライバを利用して接続するのが一般的です。以下に手順とコードのサンプルを紹介します。
目次
✅ 必要な準備
- MySQL ODBCドライバをインストール
- 「MySQL Connector/ODBC」をMySQL公式サイトからダウンロード・インストールしてください。
- 32bit版または64bit版は、Accessのバージョンと一致させる必要があります。
- 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
✅ パラメータ型の主な一覧
データ型 | 定数値 | 説明 |
---|---|---|
adVarChar | 200 | 文字列 |
adInteger | 3 | 整数 |
adDouble | 5 | 実数 |
adDate | 7 | 日付(Date型) |
adBoolean | 11 | 真偽値 |
✅ 注意点
- パラメータは 順番が重要(名前ではなく順番で渡される)。
MySQL ODBC
ドライバは@param
形式ではなく?
プレースホルダのみ対応。CommandType = 1
はadCmdText
の意味。
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
を使用すると、DATE
やDATETIME
に対応。- VBA の
Date
型で#6/7/2025#
のようにリテラルで書くか、DateSerial
/CDate
を使って構築できます。 - MySQL 側のカラムが
DATETIME
型でも、問題なく渡せます。