作業しているフォームにボタンを作成し、その Click イベントに以下を追加します。MyReportNameを実際のレポート名 に変更してください。次のコードでは、 MyReportNameが 2 回表示されます。
On Error Resume Next
DoCmd.Close acReport, "MyReportName"
DoCmd.DeleteObject acQuery, "AuditPTETotalsDateRange"
On Error GoTo Err_cmd_Click
Dim strSQL, strSQL1 As String
Dim qdef As DAO.QueryDef
strSQL = "SELECT CUSTOMER.regNum, CUSTOMER.companyName, ScrapTireType.description, ScrapTireType.PTEamount, ScrapCollectionTireType.amount, ScrapCollection.PTEtotal, ScrapCollection.Date " & _
"FROM (ScrapCollection INNER JOIN CUSTOMER ON ScrapCollection.regNum = CUSTOMER.regNum) INNER JOIN (ScrapTireType INNER JOIN ScrapCollectionTireType ON (ScrapTireType.scrapTireTypeID = ScrapCollectionTireType.scrapTireTypeID) AND (ScrapTireType.scrapTireTypeID = ScrapCollectionTireType.scrapTireTypeID)) ON ScrapCollection.scrapCollectionID = ScrapCollectionTireType.scrapCollectionID " & _
"WHERE (((ScrapCollection.Date) Between #" & [Forms]![AuditPTETotals]![startDate] & "# And #" & [Forms]![AuditPTETotals]![endDate] & "#))"
strSQL1 = "TRANSFORM Sum(AuditPTETotalsDateRange.PTEtotal) AS SumOfPTEtotal " & _
"SELECT AuditPTETotalsDateRange.companyName, AuditPTETotalsDateRange.regNum, Sum(AuditPTETotalsDateRange.PTEtotal) AS [Total Of PTEtotal] " & _
"FROM AuditPTETotalsDateRange " & _
"GROUP BY AuditPTETotalsDateRange.companyName, AuditPTETotalsDateRange.regNum " & _
"PIVOT AuditPTETotalsDateRange.description"
Set qdef = CurrentDb.CreateQueryDef("AuditPTETotalsDateRange", strSQL)
Set qdef = CurrentDb.CreateQueryDef("AuditPTETotals_CrosstabDateRange", strSQL1)
DoCmd.OpenReport "MyReportName", acViewPreview
Exit_cmd_Click:
Exit Sub
Err_cmd_Click:
MsgBox Err.Description
Resume Exit_cmd_Click
次に、フォームの On Close イベントに次を追加します。
On Error Resume Next
DoCmd.DeleteObject acQuery, "AuditPTETotalsDateRange"
ボタンをクリックすると、AuditPTETotalsDateRange が削除されてから再作成されます。また、フォームを閉じると、AuditPTETotalsDateRange クエリが削除されます。とにかくフォームが開いているときにのみクエリが必要になるため、これは問題ありません。レポートのレコード ソースを AuditPTETotals_CrosstabDateRange に設定します。
上記のコードを機能させるには、Microsoft DAO xx Object Libraryへの参照を設定する必要があります。参照セットがすでにある場合があります。xx はバージョンを表します。どのバージョンでも動作するはずです。
編集
うまくいかない場合に備えて、これらすべての変更を行う前に、元のレポートをコピーすることをお勧めします。レポートのフィールドからデータ ソースを削除して、バインドを解除してみてください。次に、open イベントに関するレポートに次のコードを追加します。
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("AuditPTETotals_CrosstabDateRange", dbOpenDynaset)
On Error Resume Next
[txtdata1].ControlSource = rs.Fields(4).Name
[txtData2].ControlSource = rs.Fields(5).Name
[txtData3].ControlSource = rs.Fields(6).Name
//And etc for as many fields as you have on report
同様の方法で、ページ ヘッダーに列見出しを割り当てることもできます。ラベルを機能させるには、バインドされていないテキスト ボックスに変更する必要があります。次のコードをページ ヘッダーの On Format イベントに追加します。
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("AuditPTETotals_CrosstabDateRange", dbOpenDynaset)
On Error Resume Next
[txtColHeading1].value = rs.Fields(4).Name
[txtColHeading2].value = rs.Fields(5).Name
[txtColHeading3].value = rs.Fields(6).Name
//And etc for as many fields as you have on report
これにより、どの列が表示されるかを確実に知らなくても、レポートを実行できます。コード内の名前と一致するようにコントロールに名前を付けるか、その逆を行ってください。