Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Access 2016)
パラメータクエリをエクセルの指定セルに出力したいです
投稿日時: 21/02/05 19:06:36
投稿者: shina

フォームのテキストボックスに入力した値を抽出条件とし、
選択クエリ内で関数を使用して集計しています。
Totalが必要な集計にはTotal用のクエリを作成し、ユニオンクエリで結合させています。
(即効テクニック「ユニオンクエリーで集計結果を最終行に追加する」を参考にさせていただきました。)
この選択クエリとユニオンクエリをExcelの指定セルへ出力したいのですが、選択クエリの方だけ何も処理されず完了してしまいます。
色々調べてはいるのですが、なかなか核心的な答えを見つけられていません。
お知恵をお貸しいただけないでしょうか?
VBAは以下のように記述しています。どうぞよろしくお願いいたします。
 
Private Sub exXLS_Click()
 
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset
Dim iFields As Integer
Dim iRow, iCol
 
   Set xlApp = CreateObject("Excel.Application")
   Set xlBook = xlApp.Workbooks.open("C:\Users\shina\OneDrive\ドキュメント\test.xlsx")
   Set xlSheet = xlBook.Worksheets("Sheet1")
   Set dbs = CurrentDb
   Set qdf = dbs.QueryDefs("ユニオンクエリ") ←ここを選択クエリにするとDoLoopの処理がスルーされてExcel保存になってしまいます。
     With qdf
        .parameters("[Forms]![main_form]![stt]") = Forms!main_form!stt
        .parameters("[Forms]![main_form]![yod]") = Forms!main_form!yod
        .parameters("[Forms]![main_form]![mod]") = Forms!main_form!mod
   Set rs = .OpenRecordset
     End With
 
        conRow = 8
        conCol = 2
        iRow = conRow
 
          With rs
             iFields = Fields.Count
             Do Until .EOF
                For iCol =conCol To iFields + 1
                   xlSheet.Cells(iRow,iCol).Value = Fields(iCol - 2).Value
                Next iCol
                .MoveNext
                iRow = iRow + 1
             Loop
             .Close
           End With
 
      xlBook.SaveAs ("C:\Users\shina\OneDrive\ドキュメント\Report.xlsx")
   With xlApp
      .Workbooks("Report.xlsx")
      .Quit
   End With
 
   Set rs = Nothing
   Set qdf = Nothing
   Set dbs = Nothing
   Set xlSheet = Nothing
   Set xlBook = Nothing
   Set xlApp = Nothing
 
End Sub

回答
投稿日時: 21/02/08 11:47:07
投稿者: sk

引用:
Set qdf = dbs.QueryDefs("ユニオンクエリ") ←ここを選択クエリにするとDoLoopの処理がスルーされてExcel保存になってしまいます。

引用:
Set rs = .OpenRecordset

引用:
With rs
   iFields = Fields.Count
   Do Until .EOF

パラメータクエリによって返されたレコードセットに
1 件もレコードが含まれていないからではないかと。

回答
投稿日時: 21/02/08 15:51:35
投稿者: Suzu

VBAを使用し、レコードセットを開き Excelに貼り付けるのであれば
ユニオンクエリにする必要はありません。
 
詳細のクエリ の内容をExcelに貼り付け、
その後に、Totalのクエリ の内容を 先の貼り付けの下に貼り付ければ良いと思います。

投稿日時: 21/02/12 19:18:00
投稿者: shina

sk様 Suzu様
ご回答ありがとうございます!
 
>sk様
ご指摘いただいた箇所をなぜレコードがないとなってしまうのか、見直したところ、ケアレスミスをしていました!またコードの記述にも重要なことを書いていませんでした。。大変失礼いたしました。
結論から申しますと、LOOPの記述ミスでした。
選択クエリのExcelへの入力先がcells(8,2)からではなくcells(8,19)からのため、
For iCol =conCol To iFields + 1
ここで列数がマイナスになってしまうようになっていました。。(フィールド数=13だったので)
ミスに気づかせていただき、本当に感謝いたします!
 
>Suzu様
ご指摘の通りですね!Excelに出力するならくっつけなくてもよかった。。
ご助言感謝いたします。
 
お二方ともお忙しいところご本当にありがとうございました。