Excel VBA + ADO での「パラメータクエリ(パラメータ付き SQL)

Excel VBA + ADO での「パラメータクエリ(パラメータ付き SQL)」の解説をします。
パラメータクエリを使うと、SQLインジェクションを防止しつつ、動的に条件を指定して検索・更新が可能になります。


目次

✅ パラメータクエリとは?

WHERE ID = 1001 のようにSQL内で値を直接書くのではなく、

SELECT * FROM Users WHERE ID = ?

のように ? でプレースホルダを使い、あとから値を「安全に」指定する方法です。


🧩 パラメータクエリの流れ(Commandオブジェクトを使う)

【使用オブジェクト】

  • ADODB.Connection:Accessに接続
  • ADODB.Command:SQLとパラメータをセット
  • ADODB.Parameter:各パラメータの定義
  • ADODB.Recordset:結果の取得

📘 サンプル:Accessの「Users」テーブルから、ID = 1001 のユーザーを検索

Sub ParameterQueryExample()
    Dim conn As ADODB.Connection
    Dim cmd As ADODB.Command
    Dim rs As ADODB.Recordset
    Dim dbPath As String

    dbPath = "C:\YourPath\YourDatabase.accdb"

    ' 接続を作成
    Set conn = New ADODB.Connection
    conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
              "Data Source=" & dbPath & ";" & _
              "Persist Security Info=False;"

    ' Commandオブジェクトを使ってSQL実行
    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = conn
    cmd.CommandText = "SELECT * FROM Users WHERE ID = ?"
    cmd.CommandType = adCmdText

    ' パラメータを定義・追加
    cmd.Parameters.Append cmd.CreateParameter("ID", adInteger, adParamInput, , 1001)

    ' 実行して結果を取得
    Set rs = cmd.Execute

    ' 結果の確認
    If Not rs.EOF Then
        MsgBox "名前:" & rs.Fields("Name").Value
    Else
        MsgBox "該当するユーザーは見つかりませんでした。"
    End If

    ' 後処理
    rs.Close: conn.Close
    Set rs = Nothing: Set cmd = Nothing: Set conn = Nothing
End Sub

🔍 各メソッド・定数の意味

メソッド / 定数説明
cmd.CreateParameterパラメータを定義する
"ID"パラメータ名(SQLが ? の場合は任意名)
adIntegerデータ型(他に adVarChar, adDate など)
adParamInput入力専用パラメータ
1001実際に渡す値

🧪 応用:文字列検索

cmd.CommandText = "SELECT * FROM Products WHERE Category = ?"
cmd.Parameters.Append cmd.CreateParameter("Category", adVarChar, adParamInput, 50, "飲料")

🧱 よく使うデータ型(CreateParameter用)

型名定数内容例
整数adInteger100, 2001
文字列adVarChar / adVarWChar“田中”, “Tokyo”
日付adDate#2024/01/01#
通貨adCurrency1234.56

🚨 注意点

  • ? の数と Parameters.Append の数は一致している必要があります。
  • Accessのクエリで「名前付きパラメータ(@param)」は使えず、位置が重要です(順番で渡される)。
  • 必ず .CommandType = adCmdText を指定してください。

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