【入門編】ユーザーの選択肢をSQLに反映させる:フォーム連携型動的クエリの作り方 – Access VBA解析バイブル

スポンサーリンク

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開発の入り口に立っています。

分からないことがあれば、いつでもまた聞きに来てください。あなたのコードが、より洗練されたものになるよう、いつでもサポートしますよ。さあ、エディタを開いて、書いてみましょう!

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