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(...) でも可 |