【極める!AccessのVBA】QueryDefを使ってパラーメータ付きクエリをレコードセットにする方法
AccessのVBAでは、レコードセットを使うことが非常に多いですよね。
特にExcel出力したい場合などは、レコードセットを使えるかどうかで自由度が変わってきます。
レコードセットはテーブルだけでなく、SELECT句で作ったクエリ(選択クエリ)を扱うことも可能なんですが、パラメータがある際には注意が必要。
今回は、パラメータ付きクエリをレコードセットとして扱う方法に特化して紹介していきましょう。
その前にパラメータについて説明
その前にの前に(笑)
パラメータと書いていますが「パラメーター」と記載されていることも多いです。
システム系の単語になると、筆者自信が語尾を伸ばすのが気持ち悪く、止めているだけなのであしからず(笑)
だからサーバーも「サーバ」です。
パラメータはクエリの条件や関数で使われることが多く、確定していないクエリの引数のような役割になります。
図のクエリでは「開始日」に対して条件が組まれていますが、具体的な日付は書かれていません。
クエリ実行する際に任意の日付を決めたい場合には、[]で囲ったパラメータを使います。
パラメータ付きクエリをそのままレコードセットにするとエラーになる
このように任意の値を条件にしたクエリは、色んな場面で便利に使えそうですよね。
でも、このクエリをそのままレコードセットにしてしまうと、たちまちエラーになってしまうんです。
Private Sub recordsetError()
Dim rs As DAO.Recordset
'エラー
Set rs = CurrentDB.OpenRecordset("パラメータ付きクエリの名前")
End Sub
筆者も知らなかった当時は、一旦追加クエリでテーブルへ放り込んでからレコードセット化していたときもありました。
でもQueryDefさえあれば、そんな必要もないんです。
パラメータ付きクエリをレコードセットにするには?
パラメータがあるクエリをレコードセットにするには、一旦QueryDefを介します。
QueryDefはクエリをオブジェクトとして認識してくれるので、デザインビューで行う動作をVBA内で再現可能。
パラメータ設定や、SQLビューにおけるSQL文の書き換えもできる優れものなんです。
Prrivate Sub parameterRecordset()
Dim qd As DAO.QueryDef
Dim rs As DAO.Recordset
Set qd = CurrentDB.QueryDefs("パラメータ付きクエリ名")
qd.Parameters("[パラメータ名]").Value = "パラメータ値"
Set rs = qd.OpenRecordset
End Sub
上記のようにQueryDefではParametersが用意されていて、クエリオブジェクトにあるパラメータ名を書くことでレコードセット化できます。
一旦、レコードセット化してしまえばこっちのもの。
フォームに書き出すなりエクセルに書き出すなり、お好きに調理できますよ。笑
QueryDefはSQLの書き換えもできる優れもの
QueryDefにすれば、クエリの中身を書き換えてレコードセットにするのも可能です。
クエリは作ったけど、条件やテーブル名が機能によって若干変わることってありますよね。
少しずつ中身の違う大量のクエリオブジェクトが出来上がってしまうエンジニアも多いでしょう。
Prrivate Sub parameterRecordset(param As String)
Dim qd As DAO.QueryDef
Dim rs As DAO.Recordset
Dim strSLQ As String
strSLQ = "Select * From foo Where hoge = """ + param + """"
Set qd = CurrentDB.QueryDefs("クエリ名")
qd.SQL = strSQL'クエリの書き換え'
Set rs = qd.OpenRecordset
End Sub
そんな時にクエリ自体の中身を少し書き換えてあげれば、条件によって機能分けみたいなことも可能になります。
クエリを使ったプログラムをワンランクアップさせよう
Accessにおいてクエリは非常に重要なポジションを担うので、機能を実装する上で重宝するケースが多いですよね。
QueryDefは、汎用的なプログラムを構築する上では外せない存在。
似たようなクエリをちまちま作っていた方にとっては、作業効率が抜群に上がること間違いなしです。