- ベストアンサー
access レポートで罫線を最後まで出力する方法
- accessのbvaの本を参照してレコードがない場合でも最後まで罫線を出力する方法を試しているのですが、インクリメントがうまくいっていないのかいつまでも改ページを続けてしまいます。
- 「T_出荷明細」というテーブルからレコード数を取得し、詳細のフォーマットイベントでレコードの印刷と改ページを制御しています。
- フォーマットイベントでは、現在印刷中のレコード番号を管理し、1ページ内のレコードの印刷と改ページの判定を行っています。
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
私の設定は「T_出荷明細」でレポートを 作成したので、No7は必要ないですね。 一応、フォームとT_出荷証明書とクエリを作成して 実行しました。ほぼ直すところは なく正常に動くのですが。 補足について: (1) >行数が実際のレコード数が28であったら14行改ページ >(ヘッダー除き)なので通常は2ページちょうどになる >はずなのですが、1ページと13行になります。 これは、質問のコードの中で、 '1ページ当たりに印刷するレコード数の定数 Private Const cintRecperPage As Integer = 15 としているので、レコードが15行まで表示され、 15以上になると次のページに表示される、 ということなので、 >1ページと13行になります。 は正常ですが。 (2) >あとループも止まりません。 これはどのような状況ですか。
その他の回答 (10)
- piroin654
- ベストアンサー率75% (692/917)
なるほど、やはり改ページコントロールの 位置の問題でしたか。ループと聞いて ひょっとしてと思って改ページコントロールの 位置をずらしてみて確認していたのですが、 他の問題があるのかと思っていました。 質問で提示されたコードはこのような場合の 模範コードのようなものですから、コードには 問題ないと思っていたのですが、解決はなによりです。 同じようなレポートを作成したいという人に とってはこのコードは最高のサンプルになります。
- piroin654
- ベストアンサー率75% (692/917)
連続ですみません。 No8の続きですが、「出荷No」フィールドを 表示する場合、 Me![出荷No].Visible = True を Me![出荷No].Visible = blnVisible として、他のフィールドと同じに 表示すれば見栄えもいいかもしれません。
お礼
piroin654さん 回答いただきありがとうございます。 piroin654さんの指摘されていたとおりにしてみましたができませんでした。 内容詳しく添付します。 テーブル T_出荷証明書 ・出荷No ・作成年月日 ・得意先etc T_出荷明細 ・ID(オートナンバー) ・出荷No ・品番 ・品名 ・数量 ・備考 クエリ Q_出荷証明書 ・ID ・出荷No(T_出荷証明書)※抽出条件 [Forms]![F_出荷印刷画面]![F出荷No] ・作成年月日 ・得意先etc ・品番 ・品名 ・数量 ・備考 【レポート】 ページヘッダー 「テキスト」・出荷No.・得意先名 「ラベル」・品番・品名・数量・備考 出荷No.ヘッダー 詳細 「テキスト」品番・品名・数量・備考 「改ページコントロール」bpage ページフッター Q_出荷証明書をもとに「R_出荷証明書3test」を作っています。 フォームで選択された「出荷No」をレポートで表示し出力する仕様です。 MAX値をカウントするところですが、 やはり、 pintRecordMAX=Dcount("*","T_出荷明細","出荷No=reports![R_出荷証明書3test]![出荷No]" にすると行数が実際のレコード数が28であったら14行改ページ(ヘッダー除き)なので通常は2ページちょうどになるはずなのですが、1ページと13行になります。 レコードが38であれば通常は2ページと10行になるはずが、2ページと8行になります。 なぜか1改ページ1行減っています。 あとループも止まりません。
- piroin654
- ベストアンサー率75% (692/917)
こちらの設定はN6、No7のようなところですが、 少し確認したいことがあります。 グループ化の設定はNo6の(2)にありますが、 質問の場合はグループの対象となるものが 「出荷No」ですから、このフィールドが 出荷Noセクションのどこかになければ 質問のコードが正常に作動しません。 したがってこちらではレポートの レコードソースを「T_出荷明細」にして、 No6の要領でレポートを作成し、「出荷No」フィールド を詳細セクションに設定し、これを グループ化の対象にしています。 したがって、そちらで作成している レポートのフィールドに「出荷No」フィールドを 追加し、コードの最後に、No6の(5)と同じように Me![出荷No].Visible = False を追加してみてください。こちらでは 一応Falseに設定していますが、 Me![出荷No].Visible = True としてください。これで質問のコードが 正常に作動すると思います。 No1の補足にある、 >pintRecordMAX = DCount("*", "T_出荷明細")にすること >でいつまでもループし続ける現象は解消しました。 >ただ、最終ページが最後まで罫線がひかれなくなりました。 >この現象を解消する方法ありますか? のようなことは何らする必要はありません。 問題はグループ化の対象のフィールドである 「出荷No」をレポートのどこに設定するかの 問題だけだと思います。
- piroin654
- ベストアンサー率75% (692/917)
No6で抜けていました。 出荷Noヘッダのプロパティ: 改ページ カレントセクションの前 です。内容はほぼNo1と同じです。
- piroin654
- ベストアンサー率75% (692/917)
質問のコード内容には問題はまったく無い と思いますが。 レポートの作成過程を記しておきます。 (1) 「T_出荷明細」を作成 フィールドはNo1と同じ (2) レポートを「T_出荷明細」を基にして 新規作成でオートレポート表形式で自動作成し、 名前を「R_出荷証明」に変更。 「並べ替え/グループ化」で「出荷Noヘッダー」 を設定。設定内容はNo1と同じ。 (3) 直線コントロール、改ページコントロール を詳細セクションに設定。 改ページコントロールの名前を「bpage」 に設定。 (4) レポートのコード表に質問のコードを 貼り付け。「出荷Noヘッダー」のフォーマット時 のイベントなどのプロシージャを各セクションの プロパティから認識確認。 (5) レポート名の設定により、 pintRecordMAX = DCount("*", "T_出荷明細", "出荷No=reports![R_出荷証明書3 test]![出荷No]") を pintRecordMAX = DCount("*", "T_出荷明細", "出荷No=reports![R_出荷証明書]![出荷No]") に設定。 コードの最後は以下に設定。フィールドを少なくしているので、 Me![出荷No].Visible = False Me![品番].Visible = blnVisible Me![品名].Visible = blnVisible 以上ですが、正常に作動します。レコード数 は各「出荷No」ごとに15未満、15以上などを 設定しています。 レポートの詳細には「出荷No」を入れています。 表示、非表示は(5)のようにしています。 なお、改ページコントロールの位置は 詳細セクションの中で、一番下方に設定 します。
- piroin654
- ベストアンサー率75% (692/917)
直線nextrecord ??? コード中の Me.NextRecord = False あるいは Me.NextRecord = True のNextRecordはレポートの NextRecord プロパティ のつもりでしたが。 直線の名前を「直線100」のように変更してみて ください。 こちらではコードはほとんど変更していない 状態で正常に表示されています。
補足
piroin654さん すみません直線nextrecordではなく 直線はnextrecordプロパティを用いて次のデータに行くMAXレコードになったときは、nextrecordに移動しないという設定にしていて、直線は出続ける設定になっています。 でした。打ち間違いです・・・。
- bonaron
- ベストアンサー率64% (482/745)
なかなか、 hatena さんが登場してこないので・・・ より簡単な方法です。 レコードがない場合も用紙の最後まで罫線を出力する http://hatenachips.blog34.fc2.com/blog-entry-17.html レコードがない場合も用紙の最後まで罫線を出力する NextRecord版 http://hatenachips.blog34.fc2.com/blog-entry-91.html
お礼
bonaronさん 回答ありがとうございました。 hatenaさんは一度回答いただいていたのですが、事務局から削除されていました。 Hpも見させていただきましたが、弊社でもともと使用していたプログラムのエラー回避の為に行っているため、あまりにも変えてしまうと・・・という部分があったので本を見て作成していたところです。 その上で、わからない部分があったので質問を上げさせてもらいました。
- piroin654
- ベストアンサー率75% (692/917)
No1で、 (2) R_出荷証明書 ヘッダ: としていますが、 (2) R_出荷証明書 セクション: です。
- piroin654
- ベストアンサー率75% (692/917)
レポート名を「R_出荷証明書」としたので、 pintRecordMAX = DCount("*", "T_出荷明細", "出荷No=reports![R_出荷証明書3 test]![出荷No]") は、 pintRecordMAX = DCount("*", "T_出荷明細", "出荷No=reports![R_出荷証明書]![出荷No]") のようにしています。 これは影響はないですね。
- piroin654
- ベストアンサー率75% (692/917)
コードはとくに問題がないと思われるので、 コードはそのままにして、こちらでレポートの 設定をしたものを記しますと、 (1) T_出荷明細: 出荷No 品番 品名 (2) R_出荷証明書 ヘッダ: レポートヘッダ ページヘッダ 出荷Noヘッダ 詳細 ページフッタ レポートフッタ 並べ替え/グループ化: 出荷No 昇順 グループヘッダ はい グループフッタ いいえ グループごと 各値 グループ間隔 1 同一ページ印刷 しない 出荷Noヘッダのプロパティ: 改ページ カレントセクションの前 レポートの詳細: 出荷No (表示が必要なければ「可視」を「いいえ」 品番 品名 (出荷Noがないとデータが表示されない) 以上の設定で15行直線コントロールを 表示し、レコードが15以上ある場合は 次のページに残りを表示しています。 上記の中で、 出荷Noヘッダのプロパティ: 改ページ カレントセクションの前 の設定が抜けている、あるいは、レポートの詳細に出荷Noが ないとかがあるのでは、と思われます
補足
piroin654さん回答ありがとうございました。 改ページの設定はしないにしていても、カレントセクションの前にしていても変わりませんでした。 直線nextrecordを用いて次のデータに行くMAXレコードになったときは、nextrecordに移動しないという設定にしていて、直線は出続ける設定になっています。 pintRecordMAX = DCount("*", "T_出荷明細", "出荷No=reports![R_出荷証明書3 test]![出荷No]") にしていたら、改ページする毎に1行行数が減る減少になっていて、きちんとしたMAX行がとれていませんでした。 pintRecordMAX = DCount("*", "T_出荷明細")にすることでいつまでもループし続ける現象は解消しました。 ただ、最終ページが最後まで罫線がひかれなくなりました。 この現象を解消する方法ありますか?
お礼
piroin654さん すみません。解決しました。 原因は改ページコントロールの位置だったようです。 言われていた通りコードには問題はありませんでした。 レポートデザインで改ページコントロールと直線コントロールの配置が同じ位置になっていたので、VBAでいくら15行改ページにしていても14行で改ページになっていたみたいです。 Q_出荷証明書のIDを表示してみてわかったのですが、ループと思っていたところも同じIDだけではなく消えていたと思っていた番号が15行毎に改ページされ最後のレコードになるまで出続けていただけでした。 31レコードの場合 1ページ目ID「1~14」が表示 2ページ目ID「15~28」が表示 3ページ目ID「29」が15回表示 4ページ目ID「29」が1回表示され「30」が14回表示 5ページ目ID「30」が1回表示・・・・・ といった感じでなっていました。 もともと他の人が作成していたレポートのVBAが15で改行の設定になっていたのに、出力されていたレポートが14行で改ページされていたので、15で割ったときはヘッダーを含めて15行なのだと勝手に勘違いしていました。 改ページコントロールの位置を変えるとヘッダーを除いて15行毎にきちんと改ページされていたので、勘違いに気づきました。 いろいろとありがとうございました。