#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のプログラムからこのクエリを兼用することができます。 |
|||
|
Copyright © T'sWare All rights reserved |