【入門編】ワイルドカード検索を安全に実装する:LIKE演算子とパラメータクエリの融合 – Access VBA解析バイブル

スポンサーリンク

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」と「パラメータ」の組み合わせは、あなたのコードを「動くだけのもの」から「信頼できるツール」へと進化させる鍵です。

さあ、恐れずにコードを書いてみてください。エラーが出たら、それはシステムがあなたに「もっと効率的な方法があるよ」と教えてくれているサインです。応援しています!

タイトルとURLをコピーしました