MS Access Tips/Sample and VBA and Blog customize etc...

パラメータクエリを含むSQLをVBAから実行する

タイトル画像

パラメータクエリをVBAでレコードセットとして開く方法は検索すれば見つかりますが、それを含むSQLを実行するとなるとそのものズバリのものはなかなか見つかりません。

難易度:

パラメータクエリを OpenRecordset

例えば下記のコードでVBAからレコードセットを開くとき、Q_名簿抽出がパラメータクエリだと、

下記のエラーがでます。

パラメータが少なすぎます。1を指定してください

「VBA パラメータクエリ」などをキーワードに検索すると、パラメータクエリをVBAで開くサンプルコードはすぐに見つかります。

QueryDef の Parameters にパラメータの値を事前に渡しておいてから、QueryDef のレコードセットを開く必要があります。要するに、データベースエンジン(DAO)はフォームのデータを読めないので、プログラムで教えてやれ、ということですね。

SQL内にパラメータクエリが含まれる場合

パラメータクエリをもとに、追加クエリ、削除クエリ、テーブル作成クエリなどを実行したいという時、例えば、下記のようなコードを実行すると、

やはり、前記と同様のエラーがでます。

簡単な解決法は、DAOを使わずに、AccessのUI(DoCmdのコマンド)を使うことです。

これで、パラメータが参照しているフォームを開いた状態で実行すればエラーなく実行されます。

DAOでパラメータクエリを含むSQLを実行する

いや、DoCmd はいやだ、DAO で実行したい、あるいは、フォームは開かずにプログラムから値を指定したい、というときは、どうしましょうか。

Parametersプロパティは QueryDef にあります。しかし、実行したいのは SQL文です。SQL文に、Parametersプロパティなんてあるはずもありません。

上記のように、2つのコードを無理やり繋げても、同じエラーになります。OpenRecordset で開いたレコードセットが、SQL文内のクエリに置き換わるなんてことはないですので。

では、どうしたらいいでしょう。クエリが必用なのでVBAでクエリを作成しましょう。

CreateQueryDef でクエリを作成して、それの Parameters を設定します。普通にクエリを作成すると後で削除とか必要になりますが、name引数(第一引数)を空白("")にしてCreateQueryDefを実行すると一時クエリになりますので、今回のようにそのときだけ必要な場合に利用すると便利です。一時クエリはスコープから抜けると自動的に削除されます。

上記のコードでエラーなく実行できます。

ちなみに、Parameters の引数はインデックスで指定することもできます。パラメータが一個のときは、下記のように記述できます。

ADOで実行する場合のコード例は下記になります。Command の Parameters を設定することになります。

拍手する

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/478-fd98fa4a
該当の記事は見つかりませんでした。