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で存在判定 | レコードがない場合の条件分岐を明示的に行う |
| クエリ再利用もOK | SQLをクエリとして登録して db.QueryDefs(...) でも可 |
