#586 フォーム参照のパラメータクエリをVBAで扱う方法 VBA

クエリでは、フォーム上のコントロールの値を参照して、それをパラメータとして抽出条件とすることがよくあります。

たとえば次のクエリでは「ID」フィールドの抽出条件が『[Forms]![frm仕入先]![ID]』となっており、「frm仕入先」フォームの「ID」という名前のコントロールの値を参照していることが分かります。もしそれがテキストボックスであれば、ユーザーが画面上から入力した任意の値を条件としてレコード抽出を行うことになります。またコンボボックスやオプショングループであればユーザーが選択した値を抽出条件とします。つまり、毎回毎回異なる値で抽出できるクエリと言えます。
クエリデザインビュー

一方、このようなフォームのコントロールを参照しているパラメータクエリをVBAでレコードセットとして開きたい場合、実際にフォームが開かれていればその値が代入されているはずなので、そのクエリ名を指定すればよさそうですが、実際にはパラメータ未指定のエラーとなってしまいます。ナビゲーションウィンドウから直接クエリを開いた場合は正しく実行できても、プログラムからは正しく呼び出せません。
●エラーとなるコード例

Dim dbs As Database
Dim rst As Recordset

Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("クエリ1")
MsgBox rst!会社名
rst.Close


この場合「パラメータが少なすぎます。1 を指定してください。」というエラーメッセージが表示されます。
エラーメッセージ


このようなパラメータを持ったクエリについては、たとえフォーム上の値が現在参照できる状態であっても、プログラム上であえてパラメータ値を指定しなければなりません。そのため、次のようなコードにする必要があります。
●パラメータを指定するコード例

Dim dbs As Database
Dim qdf As QueryDef
Dim rst As Recordset

Set dbs = CurrentDb
Set qdf = dbs.QueryDefs("クエリ1")
With qdf
  .Parameters("[Forms]![frm仕入先]![ID]") = Forms!frm仕入先!ID
  Set rst = .OpenRecordset
  .Close
End With
MsgBox rst!会社名
rst.Close


なおここでは、『[Forms]![frm仕入先]![ID]』というパラメータに対して「Forms!frm仕入先!ID」、つまりfrm仕入先フォームのIDというコントロールの値を代入していますが、フォームやコントロールとは関係ない任意の値を代入することも可能です。それによって、フォームが開いていないような場面においてもVBAのプログラムからこのクエリを兼用することができます。
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved