MS Access Tips/Sample and VBA and Blog customize etc...

レコードがない場合も用紙の最後まで罫線を出力する

レコード数に関係なく1ページの行数を固定したい。
「ページの最後まで、空白行を追加したい。

この質問は、レポートに関するFAQのベスト1と思われる。

解決法は、MSのサポート技術情報にある。
レコードがない場合も用紙の最後まで罫線を出力する方法
しかし、これもかなり複雑なコードを記述する必用があるし、
難解である。掲示板などで、上手く動かずに泣きついているのを
よく見かけます。VBAとレポートのイベントのメカニズムを理解して
いないと使いこなすのは難しい。

今回は、VBAのコードは1行記述するだけのシンプルな方法を紹介します。

RptFixRow1.png

難易度:

サンプル作成

下記のような納品書を例に説明します。
RptFixRow.gif 

ページヘッダーに、ヘッダー項目と1ページ分の罫線を配置します。
ページヘッダーデザイン

ヘッダー項目のキーフィールド(書類番号、受注コードなど)でグループ化して、
グループヘッダーとグループフッターを表示させます。グループヘッダーの
高さは、ヘッダー部分の高さに設定します。
グループヘッダーの[セクション繰り返し]を「はい」に設定します。

2016.11.10 追記: 2007以降の場合は、「代替の背景色」プロパティは「色なし」に変更しておいてください。規定値のままだと、背景色でヘッダーが上書きされて非表示になります。
RptFixRowGroupHeaderDsign.png

グループフッターの[改ページ]は「カレントセクションの後」に設定します。
詳細セクションには、明細項目を配置します。

ページヘッダーのフォーマット時のイベントプロシージャに、

と1行記述します。

1グループで複数ページになる場合、1ページの件数を固定したい場合は、

動作原理の解説

通常は、セクションの印刷後は、その高さ分移動して、次のセクションが
出力されます。
MoveLayout = False とすると、印字位置が移動せず同じ位置から
重ねて出力されます。
ページヘッダーでヘッダー項目と1ページ分の罫線を出力します。
グループヘッターでヘッダー分の高さだけ移動して、
詳細セクションを、出力します。

サンプルファイルが下記からダウンロードできます。
RptFixRow_07.zip (Access 2007-2013 形式 - 96kb)
RptFixRow.zip (Access 2002-2003 形式 - 87kb)
RptFixRow_2k.zip (Access 2000 形式 - 86kb)

拍手する

-30 Comments

ちーまげ says..."今日もお世話になりました。"

hatena様、
1年ほど前にお世話になりました ちーまげです。

現在は生産管理システムを作成しておりますが、使用する営業さんたちは
「あれもやって」、「こんな機能も付けて」と簡単に言ってくれます。(^^;
そんな自分の知識や能力を超えた苦悩の日々にhatena chipsは
一筋の光明です。
今日も助けていただきました。ありがとーございました。

2010.11.04 17:16 | URL | #- [edit]
名無し says...""

こんな技があったとは!
目からうろこです。

2012.06.18 20:52 | URL | #- [edit]
みき says...""

いつも参考にさせていただいています。
ありがとうございます。

AC2007にて実行すると上手くいかないようです。
もし出来ましたら2007版を作成いただけると
幸いです。

2012.07.04 15:03 | URL | #- [edit]
hatena says..."AC2007での動作"

AC2007でも問題なく動作します。

印刷プレビューで確認してますか?
レイアウトビュー、レポートビューでは動作しません。

2007形式(accdb)のサンプルも一応アップしておきます。

2012.07.05 11:22 | URL | #5uE6dEgY [edit]
名無し says...""

非常にわかりやすい内容で、いつも参考にさせていただいています。
ありがとうございます。

この方法をサブレポートで使用したく、実行しました。
ページヘッダーではなくレポートヘッダーを使っており、
レポート単体ではうまく機能しているのですが、
サブレポートとして見た場合(親レポートを開いた場合)、
罫線(奇数行)がうまく表示されません。
どこに問題があるのかさっぱりわからず苦心しております。
アドバイスをいただけると助かります。

2013.05.10 10:49 | URL | #- [edit]
hatena says..."re:この方法をサブレポートで使用"

この方法をサブレポートで使用したことがないので、どのような現象なのか掴めてないですが、
サブレポートを使う場合は、メインフォームの方に直線コントロールを罫線として配置しておいて、サブレポートをその罫線の背面にくるようにするという方法を取ったことがあります。
この方法を試してみてはどうでしょうか。

この方法の方がいいという場合は、現状のレポートのファイルをアップロードしてもらえれば原因をつかめるかもしれません。

2013.05.10 15:57 | URL | #5uE6dEgY [edit]
名無し says...""

サブレポートの操作の質問をしたものです。
ご連絡ありがとうございます。

結局私もメインフォームに罫線を置く方法で対応したのですが、
失敗の原因は単純…サブフォーム 詳細セクションの"代替の背景色"に色設定をしていたことでした。
お騒がせして申し訳ありありませんでした。

お返事いただけてうれしかったです。

2013.05.13 11:24 | URL | #- [edit]
あき says..."お願いがあります"

いつも参考にさせていただいています。
1グループで複数ページにわたる場合のコードをご提示いただいているものを使用してみましたが、2枚以上になる場合に表示される位置が枠外に表示されてしまいます。参考データに複数ページにわたる場合のものを掲載いただけないでしょうか?
周りに詳しい者もおらず、苦戦しております。

2013.11.26 15:51 | URL | #- [edit]
hatena says..."re:お願いがあります"

あきさん、こんばんわ。

記事内の
「1グループで複数ページになる場合、1ページの件数を固定したい場合は、」
のコードを適用してください。

2013.11.26 17:28 | URL | #5uE6dEgY [edit]
鉄血 says..."私のミスの可能性はどこに……"

はじめまして、鉄血と申します。知恵袋から紹介していただき、
早速サンプルを参考にさせていただいているのですが……。

仕上がったものは何故か表のレイアウトには問題ないのですが、
1ページに1レコードしか表示されません。
2列のものを作ろうとしていますが、1列にしても同様のため
原因は他にありそうです。

手順は掲載されているものをそのまま追ったつもりですが……。
何か原因で考えられるものがあれば、アドバイスをお願いします。

2013.12.06 21:32 | URL | #xugUH2Mw [edit]
hatena says..."re:私のミスの可能性はどこに……"

> 仕上がったものは何故か表のレイアウトには問題ないのですが、
> 1ページに1レコードしか表示されません。
> 2列のものを作ろうとしていますが、1列にしても同様のため
> 原因は他にありそうです。

グループ化しているフィールドが間違っているのでは。

このような伝票データは、通常は下記のような感じのテーブル構成になりますが、

ヘッダー項目のテーブル

伝票番号 (主キー)
顧客コード
日付

明細項目のテーブル

伝票番号
商品コード
数量
単価

このヘッダー項目の主キーの 伝票番号 でグループ化してますか。

上記と異なるなら、現状のテーブル構成と、グループ化しているフィールド名についての情報を提示してください。

2013.12.06 23:00 | URL | #5uE6dEgY [edit]
鉄血 says..."テーブル構成について"

hatena様、早々のお返事ありがとうございます。


そもそもの構造が違ってる気がしてきました……。


私が作ろうとしているものは『物品注文表』です。
大元のテーブルにある70種類程度の物品リストから
毎月必要分(大体20前後)を注文します。
クエリで抽出し、それを元にレポート出力しようとしています。

表は左右18づつ、合計36の枠があるわけです。


【ヘッダー項目のテーブル】

商品名
数量
単位

【明細項目のテーブル】

商品名
数量
単位

主キーは別に「登録番号」としてあり、レポートでは不要なので
組み込んでいません。


伝票データとは主旨が異なりますが、表(リスト)の
レポート出力で「枠を最後まで表示したい」という内容が
まさに希望のものだったので、喜び勇んでトライしました。


私の場合では、この手順では無理なのでしょうか?

2013.12.06 23:32 | URL | #xugUH2Mw [edit]
hatena says..."re:テーブル構成について"

> 【ヘッダー項目のテーブル】
>
> 商品名
> 数量
> 単位
>
> 【明細項目のテーブル】
>
> 商品名
> 数量
> 単位

まったく同じフィールド構成のテーブルが2つあるということですか。
データは異なるのですか。

あるいは、テーブルは一つのみですか。
履歴を残しておくようなタイプのテーブルではなく、毎回注文するたびに前回のデータをすべて削除してから、注文したいデータを入力して、全件レポートに出力というような運用でしょうか。

そちらの状況がよく分かりませんので、このコメント欄では使いづらいので、下記の私の運営している掲示板の方で質問しなおしてもらえますか。

その際、上記の点について、実際のテーブル構成、データ例などの情報も添えて質問してください。

2013.12.07 09:56 | URL | #5uE6dEgY [edit]
鉄血 says..."re:re:テーブル構成について"

> > 【ヘッダー項目のテーブル】
> >
> > 商品名
> > 数量
> > 単位
> >
> > 【明細項目のテーブル】
> >
> > 商品名
> > 数量
> > 単位
>
> まったく同じフィールド構成のテーブルが2つあるということですか。
> データは異なるのですか。
>
> あるいは、テーブルは一つのみですか。
> 履歴を残しておくようなタイプのテーブルではなく、毎回注文するたびに前回のデータをすべて削除してから、注文したいデータを入力して、全件レポートに出力というような運用でしょうか。
>
> そちらの状況がよく分かりませんので、このコメント欄では使いづらいので、下記の私の運営している掲示板の方で質問しなおしてもらえますか。
>
> その際、上記の点について、実際のテーブル構成、データ例などの情報も添えて質問してください。


お返事ありがとうございます。そのようにさせていただきます。

2013.12.07 13:45 | URL | #xugUH2Mw [edit]
matsu says...""

いつも参考にさせていただいてます。

5行になるように指定したのですが、5行ピッタリの状態ですと、なぜか空白ページが出るようになります。
原因は、ある程度まではつかめましたが、それ以上はわかりません。

何かアドバイスをいただけたら助かります。
よろしくお願いします。

2014.06.22 21:02 | URL | #24FJNFM2 [edit]
hatena says..."re: matsuさん"

詳細のフォーマット時に

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
  RowCnt = RowCnt + 1
  If RowCnt >= 5 Then '1ページ当たり5件
    Me.詳細.ForceNewPage = 2 'カレントセクションの後で改ページ
  Else
    Me.詳細.ForceNewPage = 0 'カレントセクションの前で改ページ
  End If
End Sub

というようなコードを記述してますか。
もし、していたらそれは削除して、ページ設定の上下余白を調整して1ページに5件になるようにしてください。

2014.06.22 21:35 | URL | #5uE6dEgY [edit]
matsu says..."re:re: matsuさん"

早速のご返信ありがとうございます。

はい、そのようにコードを入れています。
余白調整ということですが、ページヘッダーに1ページ分の罫線と下のほうに1ページ毎に集計する欄を設けていますので、
この場合は、どのようにしたら、いいのでしょうか?




2014.06.22 22:52 | URL | #24FJNFM2 [edit]
sam says..."グループ変更ごとに1ページ目がヘッダー部のみ出力される"

はじめまして。
かなり前の記事になりますので目にされないかもしれませんが、質問させていただきます。
hatenaさんが記載されているとおり行ってみましたが、
以下のように出力されてしまいます。
1p:ヘッダー部と罫線のみ
2P:ヘッダー部・罫線と1グループ目のデータ
3p:ヘッダー部と罫線のみ
4p:ヘッダー部・罫線と2グループ目のデータ
ということで、グループが変わるごとにヘッダー部(データなし)が出力されます。
どのようにすれば解決できますでしょうか。
よろしくお願いいたします。

2016.07.06 18:59 | URL | #- [edit]
hatena says..."re:グループ変更ごとに1ページ目がヘッダー部のみ出力される"

グループフッターの[改ページ]プロパティは「カレントセクションの後」に設定しますか。
また、それ以外のセクションの[改ページ]プロパティは「しない」になってますか。

※なお、メールアドレスは不必要なので削除させていただきました。

2016.07.08 01:42 | URL | #5uE6dEgY [edit]
nno says..."ページ指定時の印刷について"

初めまして、いつも参考にさせて頂いております。
ありがとうございます。

hatenaさんのこの記事を基にさせていただき、1レポートに5レコード固定で、
とある様式に差込印刷を行うツールを作成しました。

その際、差込印刷に失敗した場合(印字位置がズレたり等)は、印刷ダイヤログからページ指定を行い、
印刷を行うのですが、指定したページではなく、レコードが指定されてしまいます。
(例:3ページ目を指定し、印刷すると、3レコード目から7レコード目が印刷されてしまう。印刷したいのは11レコード目から15レコード目)

対応案等ございましたら、ご教示頂ければ幸いです。
よろしくお願い致します。

2016.12.15 11:07 | URL | #LbFZHv5A [edit]
hatena says..."re:ページ指定時の印刷について"

Me.MoveLayout = False

のコードをページヘッダーのフォーマット時のイベントプロシージャに記述してますか。
印刷時になってませんか。
他にもう一度このブログの説明通りになっているか確認してみてください。

> その際、差込印刷に失敗した場合(印字位置がズレたり等)は、

これは具体的にどのような状態なのでしょうか。
何が原因で印字位置がずれるのでしょうか。

2016.12.15 18:18 | URL | #5uE6dEgY [edit]
nno says..."re:re:ページ指定時の印刷について"

ご返信ありがとうございます。

> Me.MoveLayout = False
>
> のコードをページヘッダーのフォーマット時のイベントプロシージャに記述してますか。
> 印刷時になってませんか。

ご指摘通り、印刷時のイベントプロシージャに記述しておりました。。フォーマット時に変更したところ、ページ指定で想定のページが印刷できるようになりました。本当にありがとうございました。


> > その際、差込印刷に失敗した場合(印字位置がズレたり等)は
>
> これは具体的にどのような状態なのでしょうか。
> 何が原因で印字位置がずれるのでしょうか。

プリンターに用紙を差し込み、印刷を行うので、紙のセット位置によって印字される位置が変わる、ということでした。
言葉足らずで申し訳ございません。

ありがとうございました!

2016.12.16 08:02 | URL | #LbFZHv5A [edit]
murarin says..."ページ毎の合計表示について"

いつも参考にさせていただき大変助かっております!
今回、サンプルで提示しておりますレポートで、「合計」の部分を
そのページの小計を表示させたい場合はどのようにしたら良いのでしょうか?
他の記事で、フッターに小計を表示させる方法を参考にしてみましたが
1ページ目は表示されず、2ページ目以降のみ小計が表示されてしまいました。
以下にコードを記載します。
※「Page_sum」というテキストボックスをページヘッダーに作成した罫線の表の一番下の行に設置に各ページの小計を表示させようとしています。
------------------------------------------------------------------------
Option Compare Database
Option Explicit
Dim RowCnt As Long
Private Pagesum As Long 'ページ毎の小計

Private Sub ページフッターセクション_Format(Cancel As Integer, FormatCount As Integer)
Me.Page_sum = Pagesum
End Sub

Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)
Me.MoveLayout = False
RowCnt = 0

'ページ毎の小計を格納する変数を0に初期化
Pagesum = 0


End Sub

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
RowCnt = RowCnt + 1
If RowCnt >= 44 Then
Me.詳細.ForceNewPage = 2 'カレントセクションの後で改ページ
Else
Me.詳細.ForceNewPage = 0 'カレントセクションの前で改ページ
End If
End Sub

Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
Pagesum = Pagesum + Me.kingaku
End Sub
---------------------------------------------------------------------------
何処が違っているのかご指摘いただけると幸いです。
宜しくお願いします。

2017.01.05 11:10 | URL | #X5XodAgg [edit]
hatena says..."re:ページ毎の合計表示について"

> 今回、サンプルで提示しておりますレポートで、「合計」の部分を
> そのページの小計を表示させたい場合はどのようにしたら良いのでしょうか?
> 他の記事で、フッターに小計を表示させる方法を参考にしてみましたが
> 1ページ目は表示されず、2ページ目以降のみ小計が表示されてしまいました。
> 以下にコードを記載します。
> ※「Page_sum」というテキストボックスをページヘッダーに作成した罫線の表の一番下の行に設置に各ページの小計を表示させようとしています。

レポートのイベントの発生順序は、

ページヘッダー → 詳細セクション(行数分)→ ページフッター

となります。

レポートのイベントの発生メカニズムの研究 - hatena chips
http://hatenachips.blog34.fc2.com/blog-entry-147.html

現状では、ページヘッダーに「Page_sum」を配置しているので、
詳細のフォーマット時に加算していったものをページヘッダーに表示するのは、
不可能です。

ページフッターに「Page_sum」を配置すれば各ページの小計が表示されます。表示する位置は、ページフッターの高さ、ページ設定の上下余白を加減して、ちょうどいい位置にくるように調節してください。

2017.01.05 17:22 | URL | #5uE6dEgY [edit]
murarin says..."re:re:ページ毎の合計表示について"

> > 今回、サンプルで提示しておりますレポートで、「合計」の部分を
> > そのページの小計を表示させたい場合はどのようにしたら良いのでしょうか?
> > 他の記事で、フッターに小計を表示させる方法を参考にしてみましたが
> > 1ページ目は表示されず、2ページ目以降のみ小計が表示されてしまいました。
> > 以下にコードを記載します。
> > ※「Page_sum」というテキストボックスをページヘッダーに作成した罫線の表の一番下の行に設置に各ページの小計を表示させようとしています。
>
> レポートのイベントの発生順序は、
>
> ページヘッダー → 詳細セクション(行数分)→ ページフッター
>
> となります。
>
> レポートのイベントの発生メカニズムの研究 - hatena chips
> http://hatenachips.blog34.fc2.com/blog-entry-147.html
>
> 現状では、ページヘッダーに「Page_sum」を配置しているので、
> 詳細のフォーマット時に加算していったものをページヘッダーに表示するのは、
> 不可能です。
>
> ページフッターに「Page_sum」を配置すれば各ページの小計が表示されます。表示する位置は、ページフッターの高さ、ページ設定の上下余白を加減して、ちょうどいい位置にくるように調節してください。
早速のご回答有難うございます。
アドバイス頂いた内容を元に修正してみます。

2017.01.05 18:59 | URL | #X5XodAgg [edit]
murarin says..."空白ページが1ページ余分に出力されてしまいます"

hatena様
以前は、大変お世話になりました。
ページ毎の合計(小計)表示については、hatena様の記事
http://hatenachips.blog34.fc2.com/blog-entry-263.html
を参考にさせていただき、無事に解決しました。
有り難う御座いました。
今回は、最終頁に空白ページが余分に出力され困っています。
2ページで済むものが最終頁に空白ページが出力され3ページとなってしまいます。どこが原因と思われますか?
お手数ですが宜しくお願いします。

2017.01.13 10:07 | URL | #X5XodAgg [edit]
hatena says..."re:空白ページが1ページ余分に出力されてしまいます"

> 今回は、最終頁に空白ページが余分に出力され困っています。
> 2ページで済むものが最終頁に空白ページが出力され3ページとなってしまいます。どこが原因と思われますか?

これだけの情報では原因を特定するのは困難です。

下記の掲示板でもう少し詳細な情報を提示して質問しなおしてください。

http://hatena-access.progoo.com/bbs/

2017.01.18 14:50 | URL | #5uE6dEgY [edit]
murarin says..."re:re:空白ページが1ページ余分に出力されてしまいます"

> > 今回は、最終頁に空白ページが余分に出力され困っています。
> > 2ページで済むものが最終頁に空白ページが出力され3ページとなってしまいます。どこが原因と思われますか?
>
> これだけの情報では原因を特定するのは困難です。
>
> 下記の掲示板でもう少し詳細な情報を提示して質問しなおしてください。
>
> http://hatena-access.progoo.com/bbs/

お返事が遅くなり申し訳ありません。
また、あいまいな表現で申し訳ありません。
詳細を整理し、提示頂いたURLにて質問し直します。

2017.01.31 10:46 | URL | #X5XodAgg [edit]
yamasho says..."グループフッターで"

いつもお世話になっております。

サンプルのファイルで、テーブル「受注明細」の受注コード1001の
レコード件数を28件にしました。

その状態でレポートをプレビューすると受注コード1001が2ページになり、
3ページ目は受注コード1002になります。

レポートのグループフッターに何でもいいのでVBAを書きます。
例えば

Dim i As Long

としてレポートをプレビューすると、
3ページ目がズレて表示されます。

ご確認の程、よろしくお願い致します。


2017.06.19 13:48 | URL | #QMnOeBKU [edit]
hatena says..."re:グループフッターで"

> レポートのグループフッターに何でもいいのでVBAを書きます。
> 例えば
>
> Dim i As Long
>
> としてレポートをプレビューすると、
> 3ページ目がズレて表示されます。

確認してみましたが、症状が再現できませんでした。

そちらの設定を見直してみてください。どうしても改善されないようでしたら、下記の掲示板で再質問してください。

http://hatena-access.progoo.com/bbs/

2017.06.22 00:03 | URL | #5uE6dEgY [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/17-816165db
該当の記事は見つかりませんでした。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。