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型でも、問題なく渡せます。
