Access VBAの深淵へ:LIKE検索を「安全かつエレガント」に実装する極意
こんにちは。Accessのデータ操作に少し慣れてくると、「検索機能」を作りたくなりますよね。例えば、名前の一部を入力して抽出するような機能です。
多くの初心者の方が最初に直面するのは、「どうやってSQLにワイルドカード()を埋め込めばいいのか?」という壁、そして「SQLインジェクションというセキュリティリスク」の存在です。
今日は、マクロの記録から脱却し、「プロの現場で通用する、安全かつ堅牢な検索ロジック」を伝授します。ここをマスターすれば、あなたのAccessアプリケーションは一気に「システム」としての風格を帯びるはずです。
—
1. なぜ「文字列連結」は危険なのか?
多くの初心者がやりがちなのが、SQL文を文字列として直接連結する方法です。
‘ 危険な実装例(絶対に真似しないでください)
strSQL = “SELECT FROM T_顧客 WHERE 顧客名 LIKE ‘” & Me.txtSearch & “‘”
これには2つの大きなリスクがあります。
1. セキュリティリスク: 悪意のあるユーザーが`’ OR ‘1’=’1`のように入力すると、全データを抜かれる可能性があります(SQLインジェクション)。
2. パフォーマンスとエラー: 入力値に `’`(シングルクォーテーション)が含まれていると、SQLの文法エラーでシステムが停止します。
これを解決する唯一の正解が、「QueryDefを用いたパラメータークエリ」です。
—
2. 核心技術:QueryDef × パラメータの融合
QueryDefは、Accessが持つ「クエリ定義」をコードから直接操作するためのオブジェクトです。これを使うと、SQLとユーザー入力を完全に分離できます。
安全な実装コード
このコードは、フォーム上のテキストボックスに入力された値を受け取り、安全にワイルドカード検索を行います。
Public Sub SearchCustomer(searchKeyword As String)
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSQL As String
Set db = CurrentDb
‘ 1. クエリ定義を取得(既存のクエリ「q_Search」をベースにするのがコツ)
Set qdf = db.QueryDefs(“q_Search”)
‘ 2. SQLの基本形を定義。ここで直接値を入れず、「[prmKeyword]」というプレースホルダーを置く
strSQL = “SELECT FROM T_顧客 WHERE 顧客名 LIKE ” & [prmKeyword] & ””
qdf.SQL = strSQL
‘ 3. パラメータに値を安全にセット(ここで型やエスケープが自動処理される)
‘ ワイルドカードをSQL内で連結しているため、引数は純粋な文字列でOK
qdf.Parameters(“prmKeyword”) = searchKeyword
‘ 4. クエリを実行して結果セットを開く
‘ あとはフォームのレコードソースに設定したり、ループ処理に回せます
Dim rs As DAO.Recordset
Set rs = qdf.OpenRecordset()
‘ — ここでデータを処理 —
rs.Close
Set rs = Nothing
Set qdf = Nothing
End Sub
—
3. なぜこの方法が「伝説的」なのか?
このコードが優れている理由は3つあります。
- 分離の原則: SQLの「構造」と、ユーザーが入力する「データ」が明確に分かれています。これにより、入力値がどんなに奇妙な文字列(記号や改行など)であっても、Accessエンジンが適切にエスケープ処理してくれます。
- メンテナンス性: `qdf.SQL`を書き換えるだけで、検索ロジックをいつでも変更可能です。VBAの文字列連結地獄から解放されます。
- メモリ管理: `Set rs = Nothing` を行うことで、オブジェクトのライフサイクルを明確に管理しています。Accessの重い動作を防ぐための「現場の作法」です。
—
4. 陥りやすいエラーと回避策
Q: 「パラメータの値の入力」というダイアログが出てしまう。
A: これは、SQL内のプレースホルダー名と、`qdf.Parameters`で指定した名前が一致していない時に発生します。タイポ(打ち間違い)がないか、もう一度確認してください。
Q: LIKE検索で結果が0件になる。
A: AccessのDAOでクエリを実行する場合、ワイルドカードは “ です(SQL Serverの場合は `%` です)。今回のようにSQL文の中で `&` を使って連結する手法は、Access標準のエンジンに最も適合した書き方です。
—
最後に:エンジニアとしての一歩
Access VBAは、古臭い言語だと言われることもあります。しかし、「データの整合性を守り、リソースを適切に解放する」というエンジニアリングの基本は、現代のどの言語でも変わりません。
今回学んだ「QueryDef」と「パラメータ」の組み合わせは、あなたのコードを「動くだけのもの」から「信頼できるツール」へと進化させる鍵です。
さあ、恐れずにコードを書いてみてください。エラーが出たら、それはシステムがあなたに「もっと効率的な方法があるよ」と教えてくれているサインです。応援しています!
