Excel VBA + ADO を使った Accessデータベースの更新(UPDATE)クエリ

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 の型

データ型定数
数値adInteger1001
文字列adVarChar, adVarWChar“田中”
日付adDate#2025/07/21#
真偽値adBooleanTrue, False

⚠ よくあるミス

ミス例対処法
パラメータの数や順序が一致しない? の順番に正しく .Append する
データ型が合っていないadIntegeradVarWChar を使い分ける
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)

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