あなたは、さまざまなレポートイベントハンドラでVBAを使用するように誘惑されるかもしれないが、これはうまくいくかもしれない場合でも、私の経験からのみ適切にフォーマットするために、すべてを取得しようと頭痛につながるという。代わりに、各行にページ番号の新しいレポート表を作成することをおすすめします。並べ替えられたページ番号リストからメインレポートを取得し、ページ番号フィールドで複数列のサブレポートをバインドします。使用しているスキームに従って行を正しくページ設定する単純なVBAプロシージャを使用して、レポート表を作成します。
まず、レポートの表(あなたが必要見つけると制約を追加):サブレポートを
CREATE TABLE SubReportTable (PageNum LONG, PageOrdinal LONG, _
Ordinal LONG, LastPage BIT, [Date of Service] DATE, [Location] TEXT)
:
- RecordSoucre設定しプロパティ:
SubReportTable
(代わりにソートするクエリを指定
- 他の列設定(パディング、方向など)と共に列数を4に設定します。
- セット詳細セクションの
No
へのCanGrowプロパティとその他のコントロールが適切です。
- ページのすべての列に正しく収まるように列と詳細のサイズを変更します。 (これは、印刷プレビューとメインフォームのデザインの間を行き来する必要があります。
- レコードプロパティ:
SELECT SubReportTable.PageNum FROM SubReportTable WHERE (((SubReportTable.LastPage)=False)) GROUP BY SubReportTable.PageNum ORDER BY SubReportTable.PageNum
- 詳細セクションのプロパティフォース新しいページ
After Section
に)メインレポートで
、次のプロパティを設定します。 PageNum
- リサイズサブレポートオブジェクトにサブレポートオブジェクトのリンクマスタフィールドとリンク子供フィールド両方
- は適切にすべての列を合わせて。
メインレポートの動作を別の「最終ページ」レポートに複製します。このレポートを設定して、レポート表のページネーションデータ(つまり、LastPage = True
)に基づいて適切なレコードのサブセットを選択します。 16レコードの最後のページがどのようにフォーマットされているかによって、16レコード分だけ別のSubReportを作成する必要があるかもしれませんが、メインレポートと同じSubReportを使用すると、決定する。
- レコードプロパティ:
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を使用しました。これは、印刷プレビュー中にSubReportバインディングに問題が発生したように思われるためです。ページはレポートの既存の変数/関数の名前である可能性が高いためです。
あなたの例が20170408 - 20170413を2回表示するのはなぜですか?例を構築する上での見落としですか?なぜ6行だけ?シートに未使用の空白が残っていませんか?分析とテストのためにデータベースを提供できますか?私はBox.comファイル共有サイトを推奨し、ファイルへのリンクを投稿します。 – June7
1つの提案:複数の列のレポートを作成して、少なくとも4つの列を処理することができます。これにより、ページ間でレポートを継続することはできますが、少なくとも列の作業量は削減されます。 Access 2013の場合、レポートデザインに進み、ページ設定リボンに移動し、列アイコンをクリックしてさまざまなオプションを選択します。 –
Cross-posted at http://www.accessforums.net/showthread.php?t=65580 – June7