質問: accessのvbaで、パラメータを使用したクエリ お世話になります。 access2000のvbaで質問させてください。 現在、下記の様な状況です。 ・「テーブルa」がある。 ・「テーブルa」の"番号"が"1"のものだけを抽出する「抽出」クエリを作成 ※クエリのデザインビューで"1"を指定するのでなく、 vba上で、パラメータとして"1"を指定したい 1ではなく、2に変わる事もあるため、vbaで操作。 ・結果をexcelに書き出したい そこで、いろいろなサイトを見たのですが、 ・vbaでパラメータを使用したクエリを作成 ・excelに書き出し の2つの内容が別々に記載されており、 私の力では、別々で作成はできるのですが、 ・vbaでパラメータを使用・設定したクエリをexcelに書き出し する事はできませんでした。 本当に勝手で申し訳ございませんが、 ・vbaでパラメータを使用・設定したクエリをexcelに書き出す ソースを頂けないでしょうか? 「××と○○を組合わせればよい」などの、一部を抽出したコメントは、 不要ですので、本当に申し訳ございませんが、 ソースレベルでご返信頂ければと思います。 ※一部を抽出したコメントは、ネットで見たのですが、結果、 目的を達成することはできませんでした。 お手数で申し訳ございませんが、なにとぞ宜しくお願い致します。 ※何度ひつこい・勝手ですみませんが、ソースレベルでの 回答のみお願いします。
回答: クエリ「q2」の内容が以下になっていると仮定します。(「番号」は数値型 ) select * from テーブルa where 番号=[数字入力]; このクエリを開くと「数字入力」が表示され、入力すると抽出結果が表示されます。 以下を vba で記述し実行してみます。 public sub testdao() dim rs as dao.recordset dim i as long with currentdb.querydefs("q2") .parameters("[数字入力]") = 1 set rs = .openrecordset end with if (not rs.eof) then with createobject("excel.application") .workbooks.add with .range("a1") for i = 0 to rs.fields.count - 1 .offset(, i) = rs(i).name next .offset(1).copyfromrecordset rs end with .visible = true end with end if rs.close set rs = nothing end sub public sub testado() dim rs as adodb.recordset dim cat as new adox.catalog dim i as long cat.activeconnection = currentproject.connection with cat.procedures("q2").command .parameters("[数字入力]") = 1 set rs = .execute end with if (not rs.eof) then with createobject("excel.application") .workbooks.add with .range("a1") for i = 0 to rs.fields.count - 1 .offset(, i) = rs(i).name next .offset(1).copyfromrecordset rs end with .visible = true end with end if rs.close set rs = nothing end sub 前者がdao、後者がado 直接 excel を起動し、新規 book に抽出結果を転記して表示するまでです。 後は、 .parameters("[数字入力]") = 1 部分の値を、関数のパラメータにして受け渡しするとか・・・ フォームに入力した値を参照する様にするとか・・・・ ※ .offset(1).copyfromrecordset rs でデータを転記してますが、 書式がチョッと・・・ってな場合には、 先に書式を設定してから copyfromrecordset してみたりします。 ※ docmd.transferspreadsheet を使いたい場合は、 「数字入力」部分をフォームで作成しておいて、 クエリではそのフォームを参照するようにします。(未検証) 参考にする/しないは、自己責任にてお願いします。