dポイントプレゼントキャンペーン実施中!

Accessにてレポートを作成しています。
印刷プレビューの[最終行へ移動]ボタンの動作を
印刷プレビュー呼び出し元フォームからVBAで行えませんでしょうか。
※[印刷]ボタンを押下して遷移。

やりたい事は、ページの最後に横線を引くことです。

詳細_Printより、印刷用のworkテーブルに
ページ最終行の場合はフラグをアップデートし、
再度レポートを作成してフラグのある場合横線を引く、という構想をしていました。

印刷が2ページに渡る場合、
2ページ目以降のレコードの詳細_Printのイベントは
ページを移動させるまで発生しなかったため質問させていただきました。

縦・横線を条件付で結合等させて表示させたかったため、
詳細のlineメソッドを使って線を引いています。

また、質問内容が実現可能であれば
索引作成にも使用したいと思っています。

宜しくお願いいたします。

A 回答 (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
    • good
    • 0
この回答へのお礼

ありがとうございます!
教えていただいた内容で下線を実現することができました!
ページあたりの行数を配列に持たせ
最終ページは結局、Me.Page = Me.Pagesの時のフッタ判断を
If 行数 < (最大行数) にしてラインを生成しました。

レコードソースを変更し、ということもできるのですね。
今回はとても勉強になりました。
詳しくありがとうございました。


ただ、今回の帳票に関しては・・・
詳細_Printにて、前の明細と同じであった場合
txt項目A.visible = Falseにするという設定を行っていました。
※txt項目A は印刷時拡張 ON

そのため、初回フォーマット時には当然
txt項目A.visible = Falseを考慮したページカウントをしないため
ページあたりの最大行数、及び、総ページ数が正しく取得できていませんでした。

表示させたいレイアウトがグループで表現できなかったため
上記手段を取ったのですが色々無理させすぎですね。。

もし上記設定をふまえた最大行数の取得が可能であれば
ご教授いただきたいとは思いますが、
今回はご丁寧にありがとうございました。
とても満足しています。

お礼日時:2008/12/10 22:06

私なら、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行分の高さ以上ですと、「最終行」の判断を間違う
可能性があります。
フッタが作成されるかどうかで、ページ当たりの行数が変わる

この回答への補足

教えていただいた通り試してみました。
ですが…どうもうまく行かず…。

詳細_FormatのMe.Pagesをデバッグにて確認したところ
0のまま終わって印刷プレビュー画面になってしまいました。
そのため、グループフッター0_Formatの If 行数(最大行数-1) Then を
通っていませんでした。

考慮すべき点があったら助言いただければ嬉しいです。

補足日時:2008/12/09 09:32
    • good
    • 0
この回答へのお礼

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

また明日報告させていただきます。

お礼日時:2008/12/08 21:29

直線を描画する契機としては次のタイミングが使えます。


Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
If Me.Pages <> 0 Then
    '★ここで Line メソッドを使う。
End If
End Sub
    • good
    • 0
この回答へのお礼

詳細_Format使ってみました!
Printよりいいですね。ありがとうございます。


質問の説明が大分抜けてました。。すいません。
詳細_Format等で、
前ページの最終レコードに横線引けたら理想なのですが…。

ページの最終行を取得する方法として下記を考えました。
※元データは並び順で任意の連番を持たせています
※印刷時拡張をONにしています
(1)ページフッダ
 [グローバルなページ最終レコード更新フラグ] = TRUE
(2)詳細フォーマット時
 IF [グローバルなページ最終レコード更新フラグ]= TRUE THEN
 1つ前のレコードを最終レコード判断し、印刷用ワークTBLのフラグを更新
[グローバルなページ最終レコード更新フラグ]= FALSE (リセット)
(3)全件読み込んで印刷用ワークTBLのフラグを更新
(4)再出力
詳細フォーマット時
 IF 印刷用ワークTBLのフラグ = TRUE THEN
LINEメソッドにて下線を引く

お礼日時:2008/12/08 15:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています