Access VBAの極意:動的SQLで「検索フォーム」を自在に操る
こんにちは。日々、Accessの深淵でコードを書き続けているエンジニアです。
Accessでの開発において、避けて通れないのが「検索画面」の実装です。フォーム上のコンボボックスで選択した条件に合わせて、結果を表示する。一見単純ですが、ここには「クエリの固定」から脱却し、「SQLをプログラムとして操る」というAccess開発の本質が詰まっています。
今日は、マクロの記録から一歩先へ進みたいあなたのために、実務で死ぬほど使う「動的クエリ生成」の極意を伝授します。
—
1. なぜ「動的SQL」が必要なのか?
初心者がやりがちなのは、「クエリを何十個も作って、条件ごとに切り替える」という方法です。これはメンテナンスの悪夢です。
私たちが目指すのは、「ベースとなるSQLに、ユーザーの選択に応じたWHERE句を継ぎ足す」という手法です。これにより、どんなに複雑な検索条件でも、たった一つのプロシージャで制御できるようになります。
—
2. 実践:動的SQL生成の基本パターン
例えば、「顧客名」と「担当者」で絞り込む検索フォームを想像してください。コードは以下のようになります。
実装コード
Public Sub ApplyFilter()
Dim strSQL As String
Dim strWhere As String
‘ 1. ベースとなるSQL文(SELECT句とFROM句)
strSQL = “SELECT FROM T_顧客マスタ”
‘ 2. WHERE句の組み立て(動的生成)
‘ 顧客名が指定されていれば追加
If Not IsNull(Me.txt顧客名.Value) Then
strWhere = strWhere & ” AND 顧客名 LIKE ‘” & Me.txt顧客名.Value & “‘”
End If
‘ 担当者が指定されていれば追加
If Not IsNull(Me.cmb担当者.Value) Then
strWhere = strWhere & ” AND 担当者ID = ” & Me.cmb担当者.Value
End If
‘ 3. WHERE句の先頭にある「 AND 」を除去して結合
If Len(strWhere) > 0 Then
strSQL = strSQL & ” WHERE ” & Mid(strWhere, 6)
End If
‘ 4. クエリ定義の更新(QueryDefを使用)
CurrentDb.QueryDefs(“Q_検索結果”).SQL = strSQL
‘ 5. レポートやフォームの再描画
Me.sub検索結果.Requery
End Sub
—
3. このコードの「知的なポイント」
ただコードを書き写すだけでなく、以下の3点を意識してください。これが「できるエンジニア」への第一歩です。
① 「WHERE句の切り出し」というテクニック
`strWhere`という変数を作り、そこに`” AND …”`という形で条件を連結していくのがコツです。最後に`Mid(strWhere, 6)`で先頭の不要な「 AND 」を消す。このスマートな処理を知っているだけで、if文の迷宮から脱出できます。
② `IsNull` で「空」を判定する
ユーザーが何も入力しなかった場合を考慮せずコードを書くと、Accessは必ずエラーを吐きます。`IsNull`を使って、「値があるときだけSQLを伸ばす」という柔軟性を持たせましょう。
③ `QueryDef` の活用
`CurrentDb.QueryDefs(“Q_検索結果”).SQL = strSQL`
この一行こそが、Accessの心臓部を直接叩くコマンドです。保存済みのクエリの中身を、実行の瞬間に書き換える。これが「動的クエリ」の正体です。
—
4. 陥りやすい罠:ここだけは注意!
初学者が必ずつまずくポイントが2つあります。
- 文字列の引用符(クォーテーション)問題:
`LIKE ‘” & Me.txt顧客名 & “‘` のように、SQL内の文字列にはシングルクォーテーションが必要です。数値型の場合は不要ですが、テキスト型の場合はここを忘れるとSQL構文エラーになります。
- SQLの空振り:
検索条件が一つも選ばれていない場合、`strSQL`が `SELECT FROM T_顧客マスタ WHERE` で終わってしまい、エラーになります。上記コードのように、`Len(strWhere) > 0` でWHERE句の存在チェックを必ず行いましょう。
—
最後に:先輩からのアドバイス
「動的SQL」はAccess開発における最強のツールです。一度このパターンを身につければ、どんなに複雑な画面でも恐れることはありません。
まずは、あなたのフォームに配置したコンボボックスの値を一つずつ、このコードでSQLに反映させることから始めてみてください。それができれば、あなたはもうAccess開発の入り口に立っています。
分からないことがあれば、いつでもまた聞きに来てください。あなたのコードが、より洗練されたものになるよう、いつでもサポートしますよ。さあ、エディタを開いて、書いてみましょう!
