Excel VBA + ADO を使った Accessデータベースの更新(UPDATE)クエリ の方法を、パラメータクエリ方式で詳しく解説します。
目次
✅ やりたいこと(例)
「Users テーブルの Name を "山田太郎" に変更する。ただし、ID=1001 のレコードだけ更新する」
🧩 コード全体:UPDATE パラメータクエリのサンプル
Sub UpdateUserName()
Dim conn As ADODB.Connection
Dim cmd As ADODB.Command
Dim dbPath As String
dbPath = "C:\YourPath\YourDatabase.accdb"
' ADO接続
Set conn = New ADODB.Connection
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & dbPath & ";" & _
"Persist Security Info=False;"
' Commandオブジェクト
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = conn
cmd.CommandText = "UPDATE Users SET Name = ? WHERE ID = ?"
cmd.CommandType = adCmdText
' パラメータの追加(順番に注意)
cmd.Parameters.Append cmd.CreateParameter("Name", adVarWChar, adParamInput, 50, "山田太郎")
cmd.Parameters.Append cmd.CreateParameter("ID", adInteger, adParamInput, , 1001)
' 実行(更新件数を返す)
Dim affected As Long
affected = cmd.Execute
MsgBox affected & " 件のレコードを更新しました。"
' 後処理
conn.Close
Set cmd = Nothing
Set conn = Nothing
End Sub
🔍 解説ポイント
| 部分 | 解説 |
|---|---|
cmd.CommandText = "UPDATE Users SET Name = ? WHERE ID = ?" | プレースホルダ ? を使う |
.CreateParameter("Name", adVarWChar, adParamInput, 50, "山田太郎") | Name に更新する値(文字列) |
.CreateParameter("ID", adInteger, adParamInput, , 1001) | 条件となる主キー ID |
cmd.Execute | 実行して、影響を受けた行数(更新件数)を返す |
📌 よく使う CreateParameter の型
| データ型 | 定数 | 例 |
|---|---|---|
| 数値 | adInteger | 1001 |
| 文字列 | adVarChar, adVarWChar | “田中” |
| 日付 | adDate | #2025/07/21# |
| 真偽値 | adBoolean | True, False |
⚠ よくあるミス
| ミス例 | 対処法 |
|---|---|
| パラメータの数や順序が一致しない | ? の順番に正しく .Append する |
| データ型が合っていない | adInteger や adVarWChar を使い分ける |
| CommandTypeの指定漏れ | cmd.CommandType = adCmdText を必ず書く |
| ファイルが開きっぱなしで更新できない | 他のユーザーやExcelで開かれていないか確認 |
🧪 応用例:複数列を更新する
cmd.CommandText = "UPDATE Users SET Name = ?, Age = ? WHERE ID = ?"
cmd.Parameters.Append cmd.CreateParameter("Name", adVarWChar, adParamInput, 50, "佐藤花子")
cmd.Parameters.Append cmd.CreateParameter("Age", adInteger, adParamInput, , 30)
cmd.Parameters.Append cmd.CreateParameter("ID", adInteger, adParamInput, , 1002)
