• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Access2003レポート:最終ページへ移動)

Access2003レポート:最終ページへ移動

このQ&Aのポイント
  • Accessにてレポートを作成し、最終ページへ移動する方法についての質問です。
  • 印刷プレビューの最終行へ移動ボタンの動作を、VBAを使用して呼び出し元フォームから行いたいです。
  • また、印刷用のworkテーブルにページ最終行のフラグをアップデートし、フラグがある場合にレポートで横線を引く構想です。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

>0のまま終わって レポート内にPagesを表示する所が無いためです。テキストボックスを ページヘッダ等に設け、コントロールソースには "=[Pages]" とし、 可視を"いいえ"にします。非表示ですがPagesを参照するので、Pagesが 0のまま(設定しない)ということが防げます。 先のプログラム例では最終ページの最終行で下線がでない可能性が あります。(最終ページの行数が少ない場合) レポートのレコードソースを"SELECT 1 AS 固定,* FROM ~"に変更し、 固定でもグループフッタを設けます。固定は定数なので、最終行後に 1回だけ生成されます。つまり、グループ化で、「固定」「K」の順に 指定し、それぞれにグループフッタを設けます。中身は直線です。 Dim 最大行数 As Long Dim 行数 As Long Dim 直前フッタ As Long Private Sub ページヘッダーセクション_Format(~) 行数 = 0 '行数をクリア End Sub Private Sub 詳細_Format(~) If Me.Pages = 0 Then   '最初にページあたりの行数を調べておく   If Me.Page = 1 Then 最大行数 = 最大行数 + 1 End If 行数 = 行数 + 1 End Sub Private Sub グループフッター1_Format(~) If Me.Pages = 0 Then   Cancel = 1 'Pages調査中はフッタを生成しない Else   '最下行より前はフッタを生成しない If 行数 < (最大行数 - 1) Then Cancel = 1 End If 直前フッタ = Cancel '直前にフッタを生成したかどうかを記録 End Sub Private Sub グループフッター0_Format(~) '最終行のフッタと最下行のフッタが重複しない処置 If 直前フッタ = 0 Then Cancel = 1 End Sub

mini0524
質問者

お礼

ありがとうございます! 教えていただいた内容で下線を実現することができました! ページあたりの行数を配列に持たせ 最終ページは結局、Me.Page = Me.Pagesの時のフッタ判断を If 行数 < (最大行数) にしてラインを生成しました。 レコードソースを変更し、ということもできるのですね。 今回はとても勉強になりました。 詳しくありがとうございました。 ただ、今回の帳票に関しては・・・ 詳細_Printにて、前の明細と同じであった場合 txt項目A.visible = Falseにするという設定を行っていました。 ※txt項目A は印刷時拡張 ON そのため、初回フォーマット時には当然 txt項目A.visible = Falseを考慮したページカウントをしないため ページあたりの最大行数、及び、総ページ数が正しく取得できていませんでした。 表示させたいレイアウトがグループで表現できなかったため 上記手段を取ったのですが色々無理させすぎですね。。 もし上記設定をふまえた最大行数の取得が可能であれば ご教授いただきたいとは思いますが、 今回はご丁寧にありがとうございました。 とても満足しています。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

私なら、Lineのような動的手段は用いず、次の方法にします。 (1)レポートのデータで一意で、昇順になっている項目(以下、K)を  指定して、グループフッタを作り、横線を置く。 (2)レポートの内部プログラム Dim 最大行数 As Long Dim 行数 As Long Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer) 行数 = 0 '行数カウンタをクリア End Sub Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) If Me.Pages = 0 Then     '初回フォーマット時に行数/ページを求めておく     If Me.Page = 1 Then         最大行数 = 最大行数 + 1     End If End If 行数 = 行数 + 1 '現在の行位置を更新する End Sub Private Sub グループフッター0_Format(Cancel As Integer, FormatCount As Integer) If Me.Pages = 0 Then Exit Sub 'ページ内の最終行でなければ、このセクションを生成しない。 If 行数 < (最大行数 - 1) Then Cancel = 1 End Sub 考え方としては以下の通りです。 (1)Me.Pages = 0  全ページ数を求めるため、一通り明細行をFormatしますが、その途中  ではPagesが確定していないので0になっています。 (2)Me.Page = 1  1ページ目で何回Formatされるか数えます。これが最大行数です。  実際はFormatした後で、ページをはみ出すかどうかがチェックされ、  はみ出さなければPrintされ、はみ出せばPrintされません。  従って、カウントした値は実際はページ当たりの行数+1です。 (3)If 行数 < (最大行数 - 1) Then Cancel = 1  行数(ページ内の行位置)が最終行位置でなければ、フッタの生成を  キャンセルします。このセクションにある線も作成されません。  上記条件以外(最終行)の場合はフッタの生成をキャンセルしない  ので、このセクションにある線も作成されます。 但し、フッタが線だけ(高さが非常に低い)とした時の考え方です。 最大行数を数えている間はフッタはキャンセルされないので、 「はみ出し」のチェックはフッタ込みで調べられます。実際のFormat では最終行だけフッタが出るので、キャンセルされたフッタの高さの 合計が明細行1行分の高さ以上ですと、「最終行」の判断を間違う 可能性があります。 フッタが作成されるかどうかで、ページ当たりの行数が変わる

mini0524
質問者

お礼

丁寧にありがとうございます!! 今Access環境がないので明日挑戦してみます。 Pages, Pageにこんな特性があるとは思っていませんでした。 勉強になります。。 また明日報告させていただきます。

mini0524
質問者

補足

教えていただいた通り試してみました。 ですが…どうもうまく行かず…。 詳細_FormatのMe.Pagesをデバッグにて確認したところ 0のまま終わって印刷プレビュー画面になってしまいました。 そのため、グループフッター0_Formatの If 行数(最大行数-1) Then を 通っていませんでした。 考慮すべき点があったら助言いただければ嬉しいです。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

直線を描画する契機としては次のタイミングが使えます。 Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) If Me.Pages <> 0 Then     '★ここで Line メソッドを使う。 End If End Sub

mini0524
質問者

お礼

詳細_Format使ってみました! Printよりいいですね。ありがとうございます。 質問の説明が大分抜けてました。。すいません。 詳細_Format等で、 前ページの最終レコードに横線引けたら理想なのですが…。 ページの最終行を取得する方法として下記を考えました。 ※元データは並び順で任意の連番を持たせています ※印刷時拡張をONにしています (1)ページフッダ  [グローバルなページ最終レコード更新フラグ] = TRUE (2)詳細フォーマット時  IF [グローバルなページ最終レコード更新フラグ]= TRUE THEN  1つ前のレコードを最終レコード判断し、印刷用ワークTBLのフラグを更新 [グローバルなページ最終レコード更新フラグ]= FALSE (リセット) (3)全件読み込んで印刷用ワークTBLのフラグを更新 (4)再出力 詳細フォーマット時  IF 印刷用ワークTBLのフラグ = TRUE THEN LINEメソッドにて下線を引く

関連するQ&A