Access VBAでの**条件付き検索(レコード抽出)を行う

Access VBAでの**条件付き検索(レコード抽出)を行う際、信頼性・保守性・安全性を高めるための「ベストプラクティス(実践的な推奨方法)」を以下にまとめます。


目次

✅ 基本構文(SQL + OpenRecordset)

Dim rs As DAO.Recordset
Dim sql As String
sql = "SELECT * FROM ユーザー WHERE ユーザーID = 'user1'"
Set rs = CurrentDb.OpenRecordset(sql, dbOpenSnapshot)

✅ ベストプラクティス一覧

項目内容
1. SQLを変数で組み立てる条件値を組み合わせて柔軟なSQLを構築
2. 文字列のクォートに注意シングルクォート 'user1' のように囲むこと
3. Replace()でエスケープユーザー入力に '(アポストロフィ)を含む可能性を想定
4. パラメータ化の代替DAOにパラメータはないので、SQL文字列を安全に構築する
5. 存在確認に .EOF を使う該当レコードがあるかどうかを必ずチェック
6. 取得後は .Close & Set = Nothing を忘れずにリソースリーク防止

🧪 サンプル:ユーザーIDで安全に検索

Sub FindUserByID(userID As String)
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim sql As String

    ' クォート内の " ' " を安全に処理(SQLインジェクション対策)
    userID = Replace(userID, "'", "''")

    sql = "SELECT * FROM ユーザー WHERE ユーザーID = '" & userID & "'"

    Set db = CurrentDb()
    Set rs = db.OpenRecordset(sql, dbOpenSnapshot)

    If rs.EOF Then
        MsgBox "該当するユーザーが見つかりません。"
    Else
        MsgBox "ユーザー名: " & rs!ユーザー名 & vbCrLf & "メール: " & rs!メール
    End If

    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Sub

🧩 応用:複数条件をANDで組み立てる

sql = "SELECT * FROM ユーザー WHERE メール LIKE '%@gmail.com' AND パスワード = 'pas001'"
  • AND / OR の使い方で条件を柔軟に制御
  • 日付や数値はクォート不要、文字列は ' ' で囲む

🧩 日付条件の注意点(# で囲む)

sql = "SELECT * FROM 登録 WHERE 登録日 >= #" & Format(Date, "yyyy/mm/dd") & "#"

Access SQLでは、日付リテラルは #日付# で囲むのがルールです。


✅ よくある失敗パターンと対策

よくある失敗対策
シングルクォートが足りない'" & 値 & "'" の形式にする
ユーザー入力のSQL破壊(O’Connor)Replace(txtInput, "'", "''") でエスケープ
SQLに日付を渡してエラー#yyyy/mm/dd#形式に変換して組み立てる

✅ まとめ

ポイント実践方法
SQLは文字列変数で扱う"SELECT ... WHERE ..." & 値 で構築
入力は Replace() で安全化' → '' に置換
.EOFで存在判定レコードがない場合の条件分岐を明示的に行う
クエリ再利用もOKSQLをクエリとして登録して db.QueryDefs(...) でも可

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