你也許會在各種報表事件處理程序使用VBA,但即使這可能工作,從我的經驗,只會導致頭痛試圖讓一切正確格式。相反,我建議在每一行上創建一個帶有頁碼的新報表。從排序的頁碼列表中獲取主報表,並通過頁碼字段綁定多列子報表。根據您的方案,使用簡單的VBA過程填充報表,以正確分頁行。
首先報告表(添加約束你找到需要):
CREATE TABLE SubReportTable (PageNum LONG, PageOrdinal LONG, _
Ordinal LONG, LastPage BIT, [Date of Service] DATE, [Location] TEXT)
子報表上:
- 設置RecordSoucre屬性:
SubReportTable
(或者指定排序的查詢所需字段)
- 將列數設置爲4以及其他列設置(填充,方向等)。
- Set CanGrow property to
No
on Detail section and other controls as appropriate。
- 調整欄和細節部分的大小以適合頁面上的所有欄。 (這可能需要在主窗體上的打印預覽和設計之間來回切換。)
在主報告中,設置以下屬性:
- 記錄源屬性:
SELECT SubReportTable.PageNum FROM SubReportTable WHERE (((SubReportTable.LastPage)=False)) GROUP BY SubReportTable.PageNum ORDER BY SubReportTable.PageNum
- 詳細信息部分財產強制新頁到
After Section
。
- 子報表對象的鏈接主字段和鏈接子字段既
PageNum
- 調整大小子報表對象來適合所有列。
在單獨的「最後一頁」報告上覆制主報告上的行爲。設置此報告根據報告表中的分頁數據(即LastPage = True
)選擇合適的記錄子集。根據最後一頁有16條記錄的格式不同,它可能還需要爲16條記錄創建一個單獨的子報表,但是您可能會使用與主報表相同的子報表...這將是您的問題以確定。
- 記錄源屬性:
SELECT SubReportTable.PageNum FROM SubReportTable WHERE ((SubReportTable.LastPage = True)) GROUP BY SubReportTable.PageNum ORDER BY SubReportTable.PageNum
最後一些代碼來填充報表中。您可以直接從VBA即時窗口運行此過程,或將其放入某個按鈕的單擊事件處理程序中。分頁邏輯可以進行調整以在最後一頁獲得適量的記錄。
Public Sub PrepareSubReporTable()
On Error GoTo Catch_PrepareSubReporTable
Dim db As Database
Dim rs As Recordset2
Dim rows As Long, pgs24 As Long, rowsLast24 As Long, rows16 As Long
Dim i As Long, p As Long, pi As Long
Set db = CurrentDb
db.Execute "DELETE * FROM [SubReportTable]", dbFailOnError
db.Execute _
"INSERT INTO SubReportTable (PageNum, PageOrdinal, Ordinal, LastPage, [Date of Service], [Location])" & _
" SELECT Null AS PageNum, Null AS PageOrdinal, Null AS Ordinal, False as LastPage," & _
" [Data].[Date of Service], [Data].[Location]" & _
" FROM [Data]" & _
" ORDER BY [Data].[Date of Service], [Data].[Location];", _
dbFailOnError
rows = db.OpenRecordset("SELECT Count(*) FROM SubReportTable").Fields(0)
pgs24 = rows \ 24
rows16 = rows - 24 * pgs24
If rows16 > 16 Then
rowsLast24 = rows16
pgs24 = pgs24 + 1
rows16 = 0
Else
rowsLast24 = 24
End If
Set rs = db.OpenRecordset(_
"SELECT * FROM SubReportTable" & _
" ORDER BY [Date of Service], [Location];")
i = 0
Do Until rs.EOF
p = i \ 24 + 1
rs.Edit
rs![PageNum] = p
If p > pgs24 Then
rs![lastPage] = True
pi = (i - pgs24 * 24) Mod 16 + 1
Else
pi = i Mod 24 + 1
End If
rs![PageOrdinal] = pi
i = i + 1
rs![Ordinal] = i
rs.Update
rs.MoveNext
Loop
rs.Close
Exit Sub
Catch_PrepareSubReporTable:
MsgBox Err.Number & ": " & Err.Description, _
vbOKOnly Or vbExclamation, "Error in PrepareSubReporTable"
End Sub
現在產生主報告和最後頁的報告,可以手動或VBA代碼的某個地方。
注:我使用字段名稱PageNum而不是Page,因爲這在打印預覽過程中似乎會導致SubReport綁定出現問題......可能是因爲Page是報告的現有變量/函數的名稱。
爲什麼您的示例顯示20170408 - 20170413兩次?只是在建立這個例子時忽略一下?爲什麼只有6條線?這不會在工作表上留下很多未使用的空白空間嗎?你能提供數據庫進行分析和測試嗎?我推薦Box.com fileshare網站和文章鏈接。 – June7
一個建議:您可以創建一個多列報表來至少處理四列。這仍然留下頁面之間繼續報告的任務,但至少會減少列的工作量。對於Access 2013,轉到報表設計,然後轉到頁面設置功能區,然後單擊各列的圖標以獲得各種選項。 –
交叉發佈在http://www.accessforums.net/showthread.php?t=65580 – June7