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

用紙の最後まで罫線を出力-1ページ目と2ページ目以降の行数が異なる場合

納品書や見積書等で、複数ページにわたる場合、下図ように1ページ目と2ページ目以降の行数が異なるようにしたい場合は結構あると思います。

納品書レポートプレビュー

「hatena の Microsoft Access 掲示板」に同様の質問に対してサンプルを作成したので、こちらで解説をします。

空白行も罫線を引く方法(2ページ目以降)

難易度:

追記: 下記の方法でも対応可能です。下記の方が、設定、コードがシンプルなので推奨します。
余白に応じて行数指定無く用紙の最後まで罫線を出力する - hatena chips

デザインビューでの設定

まず、ヘッダーですが、1ページ目には、顧客名や合計などと、表のヘッダー(項目名)を表示して、2ページ目以降は表ヘッダーのみ表示する、というように表示項目が変わってきます。

「並び替え/グループ化の設定」(AC2010では、[グループの追加])で、グループキー(受注コードなど)を2回追加して、グループヘッダーを表示させます。

これで、グループヘッダーが2つ出来ますので、上のグループヘッダーに1ページのみの項目を、下のグループヘッダーにはその以外の項目を配置します。

下のグループヘッダーの「セクション繰り返し」プロパティを「はい」に設定します。

ページヘッダーには、テキストボックスを配置して、下記のように設定します。

プロパティ設定値
コントロールソース=[Page
名前txtPage
書式0" Page"

レポートのデザインビュー

あと、下記のページの「デザインビューでの設定」の通りに設定します。
(テキストボックス GCnt と Cnt の配置とグループフッターに罫線をコピー)

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

イベントプロシージャ

フォームモジュールは下記のようになります。

2011/06/15:コード修正
コメントで指摘された不具合を修正しました。行のカウントアップ(CurRow = CurRow + 1)を印刷時イベントでしていたのを、フォーマット時イベントに移動しました。
2011/06/24:コード修正
コメントで指摘された不具合を修正しました。最終ページでレコードがちょうど最終行まであるとき、次のページに空白行ができる不具合に対処しました。

定数 RowsPerPage で1ページ当たりの行数を設定します。
定数 LessRowFirstPage で1ページ目の行数を RowsPerPage よりどれだけ減らすか設定します。
上記のコードでは、1ページ目が 15行、2ページ目以降が 20行になります。

サンプルファイルが下記からダウンロードできます。
RptFixRowLessRowInFirstPages_07.zip (Access 2007 形式 - 65kb)
RptFixRowLessRowInFirstPages.zip (Access 2002-2003 形式 - 62kb)
RptFixRowLessRowInFirstPages_2k.zip (Access 2000 形式 - 60kb)

拍手する

36 Comments

まいど says...""

さっそくサンプルファイルをダウンロードして参考にさせていただきました。
プレビューで最後のページに飛び全71ページあること確認したのちに、矢印キー(← →)で行ったり来たりしているとページが増えてしまいました。
具体的には、最初のグループが最初は2ページだったのにいつの間にか3ページになっていました。

2011.06.15 15:05 | URL | #- [edit]
hatena says..."不具合、修正"

まいどさん、不具合の報告、ありがとうございます。

ブログに掲載のコードを対策済みにものに修正しておきました。

今、出先ですので、サンプルファイルの修正は、しばらくお待ちください。

2011.06.15 16:06 | URL | #5uE6dEgY [edit]
hatena says..."サンプルファイルも修正しました"

先ほど、サンプルファイルも修正したものに置き換えました。前にダウンロードした方は再ダウンロードしてください。

2011.06.15 19:25 | URL | #5uE6dEgY [edit]
mosimo says..."ブラウザ?"

サンプルファイルを開くと
「最新のInterNetExprolerを入手して下さい」と表示され、
Openできません。(泣)ぜひ活用させて頂きたいと思って
いました。環境が宜しくないのでしょうか?
(RptFixRowLessRowInFirstPages_2k.zipが開かないです。)
当方:WinXP Access2K、IE8.0です。
宜しくお願いします。

2011.06.20 16:06 | URL | #- [edit]
hatena says..."re:ブラウザ?"

当方の環境(Win7 IE9)では問題なく開けます。

IEが関係するとも思えませんので、不思議な現象ですね。

右クリックの送る機能で作成したのですが、
Lhaplusで圧縮したものに置き換えましので、
一度試してみてください。

それでダメなら、このページの上部の「CONTACT ME」を
クリックしてメールフォームでメールアドレスをお知らせください。
メールで生のMDBファイルを送付します。

2011.06.21 01:30 | URL | #5uE6dEgY [edit]
mosimo says..."Access2003で"

hatenaさんに送信して頂いたMDBファイル、
社内にAccess2003のバージョンがあり、
そちらでで開くことができました。

ありがとうござました。

2011.06.21 15:23 | URL | #- [edit]
shige says..."1ページのレコード数"

1ページのレコード数が行数と同じ場合に
2ページ目に空の罫線が1行出力されるのは
仕様上しょうがないのでしょうか。

2011.06.24 14:20 | URL | #.YweiFeg [edit]
hatena says..."re:1ページのレコード数"

バグですね。
行数=レコード数の場合の処理を見落としてました。
ご指摘ありがとうございます。

記事のコードを訂正しておきました。

サンプルもこの後修正しておきます。

2011.06.24 17:03 | URL | #5uE6dEgY [edit]
Access 探求隊 says..."レポート作成には本当に苦労します"

いつも参考になるソースをありがとうございます。
1つ気が付いた事なんですが、末行の合計欄にページ毎の
金額合計(累計)を作成しましたが、どうしても上手くできません。何かアイデアはありませんか?

2011.08.27 11:41 | URL | #D46HOIec [edit]
hatena says..."re: レポート作成には本当に苦労します"

ページ毎の集計をページヘッダーに表示させる - hatena chips
http://hatenachips.blog34.fc2.com/blog-entry-263.html

で紹介しているページフッターに表示させる方法をつかえば
どうですか。

2011.08.28 15:59 | URL | #5uE6dEgY [edit]
Access探求隊 says..."re:re: レポート作成には本当に苦労します"

解答ありがとうございます。

私みたいな素人を相手で申し訳ございません。
上記の指示のサンプルは拝見させてもらっているのですが、
求めているのは
1ページ目と2ページ目以降の行数が異なるようにしたい場合のサンプルの1ページ目にページ金額小計、明細終了後のページの最終行に金額合計を出したい場合の事案でして

書き方が悪かったので申し訳ありませんでした。

2011.08.28 21:45 | URL | #D46HOIec [edit]
hatena says..."ページ小計"

ページフッターに表示するのなら、
ページ毎の集計をページヘッダーに表示させる - hatena chips
http://hatenachips.blog34.fc2.com/blog-entry-263.html
で紹介した方法が使えると思いますが、
どのようにして、どこがうまくいかないのか、
説明してもらえますか。

2011.08.28 23:37 | URL | #5uE6dEgY [edit]
Access探求隊 says...""

1ページ目は15行、2ページ目は20行と設定した際にですが
1ページ目は15行目の欄に小計金額を金額欄に印刷して
2ページ目の明細が仮に15行/20行中あったと仮定した場合に
20行目に明細金額の合計を印刷いたいのです。
勿論、全体明細行数が35行を超えて3ページ目に突入しても
同じ結果が反映してくれるのが大前提なんですけど。

どうもアクセスレポートに苦戦します
いつもはエクセルに番地を指定してエクスポートさせて使用して
いますが、せっかくレポート機能を保持していますので
面倒でも挑戦してみたく
ただ今、悪戦苦闘中です。

エクセル書式は何か味気なく一般的すぎるのと
簡単にデータを改ざん出来てしまうので、メリットであると同時に
デメリットにもなってしまってます。

2011.08.29 01:05 | URL | #D46HOIec [edit]
hatena says...""

> 1ページ目は15行、2ページ目は20行と設定した際にですが
> 1ページ目は15行目の欄に小計金額を金額欄に印刷して
> 2ページ目の明細が仮に15行/20行中あったと仮定した場合に
> 20行目に明細金額の合計を印刷いたいのです。

詳細を、1ページ目は14行、2ページ目以降は19行と設定して、
小計は、ページフッターに表示させます。

詳細とページフッター間に隙間で出来る場合は、ページ設定の
下余白を増やします。下余白は0.01mm単位で指定できますので、
こまめに調整すればピッタリとくっけることができます。

この方法が一番簡単だと思います。

他にもアイデアは思いついていますので、時間がとれればサンプルをアップ
するかも知れませんので、たまに見に来てください。

2011.08.29 20:41 | URL | #5uE6dEgY [edit]
Access 探求隊 says..."ありがとうございます"

まずは試してまた報告させていただきますね。

2011.08.30 00:15 | URL | #- [edit]
Access探求隊 says..."無事に解決いたしました。"

色々とありがとうございました。
無事解決いたしました。
これからも宜しくお願い致します。

2011.09.01 08:28 | URL | #D46HOIec [edit]
しぃ says..."全体ページ番号の表示"

はじめまして、いつも参考にさせていただいています。

本記事を基に作成したレポートを使用していますが、
印刷枚数が300枚を超えるため、ページ抜けを確認するために
全体のページ番号をページフッタに印字したいと思っています。

グループごとのページ番号/総ページの印字を残したまま
全体のページ番号を取得する方法が思い至りません。
どのようにすれば印字することができますでしょうか。

丸投げのような質問で申し訳ありませんが、
良い方法があればヒントをいただければ幸いです。

2015.12.02 09:16 | URL | #PyFckM9o [edit]
namisan says..."合計の取り方"

いつも参考にさせていただいております。
合計の取り方を教えてください。
サンプルで言いますと、受注コードが変わったごとに金額の合計を一番下の行に表示するにはどうしたらよいのでしょうか?
データが少なく1ページのみの表示の時は1ページ目の最後の行に、
データが多く複数ページある時は、最後のページの一番下の行に、
受注コードの金額合計が表示させたいです。

よろしくお願いします。

2015.12.04 14:54 | URL | #MAcqijD. [edit]
hatena says..."re:全体ページ番号の表示"

> グループごとのページ番号/総ページの印字を残したまま
> 全体のページ番号を取得する方法が思い至りません。
> どのようにすれば印字することができますでしょうか。

レポートのモジュールで変数を宣言して、ページフォーマット時で加算していけばいいでしょう。
レポートヘッダーのフォーマット時で0にリセットします。

全体ページ表示用のテキストボックスの名前は txtTPage として下記のコードで。

Option Compare Database
Option Explicit

Dim TPage As Long


Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)
  TPage = TPage + 1
  Me.txtTPage = TPage
End Sub

Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer)
  TPage = 0
End Sub

2015.12.05 16:37 | URL | #5uE6dEgY [edit]
hatena says..."re:合計の取り方"

> 合計の取り方を教えてください。
> サンプルで言いますと、受注コードが変わったごとに金額の合計を一番下の行に表示するにはどうしたらよいのでしょうか?
> データが少なく1ページのみの表示の時は1ページ目の最後の行に、
> データが多く複数ページある時は、最後のページの一番下の行に、
> 受注コードの金額合計が表示させたいです。

一番下の行とは、ページフッターの部分ということでしょうか。
最後のページ以外の場合は、ページフッターの部分は空白ということですか。

例えば、1ページ5行の詳細、1行がページフッター

--------------1ページ目
1 あ 100
2 い 200
3 う 300
4 え 400
5 お 500
F
--------------
--------------2ページ目
1 か 100
2 き 200
3 
4 
5 
F 合計 1800
--------------

※F ページフッター

あるいは、ページフッターはなしで、下記のような感じでしょうか。

--------------1ページ目
1 あ 100
2 い 200
3 う 300
4 え 400
5 お 500
--------------
--------------2ページ目
1 か 100
2 き 200
3 
4 
5 合計 1800
--------------

この場合、データが10件の場合は合計はどこに表示しますか。

2015.12.05 16:51 | URL | #5uE6dEgY [edit]
しぃ says..."re:re:全体ページ番号の表示"

hatenaさま

ありがとうございます。
お返事を待つ間に自分で色々試してみたのですが、
私が考えたのはグループヘッダ1のフォーマット時に変数を加算する
という方法でした。

確かにページヘッダで計算させたほうが確実ですよね。
ちょっと考えれば答えは見つかりそうなのに、
考える時間を惜しんで誰かに尋ねてしまうのは
簡単ですが身につきにくいと最近痛感します。

hatenaさまのサンプルも右から左へ書き写すだけではなく、
なるべく自分で編集加工しながら結果の違いを確認し、
構造を理解するようにしていきたいと思います。

このたびはありがとうございました。

2015.12.07 14:24 | URL | #PyFckM9o [edit]
あず先生 says...""

お世話になります。
Accessは基本中の基本がわかる程度の初心者です。
ご教示ください。

本サンプルをダウンロードしてR_納品書レポートを自分の手持ちファイルにコピーさせていただきました。

テーブルは他システムから出力したcsvファイルを取り込んだものでフィールド名はcsvからのものを使用しています。

レポートのプロパティでレコードソースを上記でcsvで作ったテーブルを指定し関連づけました。

テキストBOXのコントロールソースを新しく関連付けたテーブルのフィールド名に変更して、レポートを開こうとしたところ、エラーとなり、「パラメーターの入力」(受注コード・商品コード)が表示されます。何も入れずOKで進めると、「コンパイルエラー:メゾットまたはデータメンバーが見つかりません。」がでて、Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) が黄色帯でエラーとなります。 どのように修正したら良いでしょうか。
お手数ですがよろしくお願いいたします。


2016.11.07 00:19 | URL | #H6hNXAII [edit]
あず先生 says...""

すみません、追記です。
最終的にはクエリで「受注番号」ごとに納品書を印字したいです。

2016.11.07 03:36 | URL | #H6hNXAII [edit]
hatena says..."to:あず先生"

Access のバージョンをお知らせください。

> テキストBOXのコントロールソースを新しく関連付けたテーブルのフィールド名に変更して、レポートを開こうとしたところ、エラーとなり、「パラメーターの入力」(受注コード・商品コード)が表示されます。

グループ化、並べ替え、集計 のグループのフィールド名が「受注コード」「商品コード」のままではないですか。もし、そうなら、レコードソースの実際のフィールド名に変更してください。

2016.11.07 11:31 | URL | #5uE6dEgY [edit]
あず先生 says...""

ご回答ありがとうございます!
Accessのバージョンは2013です。

ご指摘の箇所の変更ができていなかったので変更しました。
それによりパラメーターは2つともでなくなりました。

しかしレポートを開こうとすると「コンパイルエラー」が出てきてしまいます。「メゾットまたはデータメンバーが見つかりません」

↓ここに黄色の帯がかかり、
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
Dim R As Long

If RowsPerPage > CurRow And Me.Cnt <= Me.GCnt Then

最後の「.GCnt」に青帯がかかっています。

どのように修正したら良いかご教示お願いいたします。


2016.11.08 02:38 | URL | #H6hNXAII [edit]
hatena says..."to:あず先生"

> ↓ここに黄色の帯がかかり、
> Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
> Dim R As Long
>
> If RowsPerPage > CurRow And Me.Cnt <= Me.GCnt Then
>
> 最後の「.GCnt」に青帯がかかっています。

レポートの グループヘッダーに「GCnt」という名前のテキストボックスはありますか。
なかったら、グループヘッダーにテキストボックスを配置して下記のように設定してください。

名前 GCnt
コントロールソース =Count(*)
可視 いいえ

2016.11.08 11:08 | URL | #5uE6dEgY [edit]
あず先生 says...""

ありがとうございます!
お陰様で解決いたしました。感謝いたします。

度々恐縮なのですが、別件で相談させてください。
明細行の最後に「小計」「消費税」「送料」「総合計」の4行を出力したく、他のレイアウトなども試してみましたが商品件数が変動するためちょうどページをまたがるような微妙な商品件数の場合きれいに表示させることが難しかった為、こちらのフォーマットを使いヘッダに上記4行を掲載しようと思っています。
それで解決なのですが、欲をいえばページの下の方にこの4つを表示したいのですが何か良い方法はないでしょうか?(計算はcsvから取り入れた地点でされているので不要で、表示のみです。)
商品件数により、レポートが1ページのみの場合も、2ページにまたがる場合も、この4つの表示は最終ページ1枚だけが希望です。

何度もすみませんがアドバイスいただけましたら幸いです。
よろしくお願いいたします。

2016.11.08 17:28 | URL | #H6hNXAII [edit]
hatena says..."to:あず先生"

> 何度もすみませんがアドバイスいただけましたら幸いです。
> よろしくお願いいたします。

このページの記事内容とは関連がない質問となりますので、下記の私が管理人をしている掲示板で質問し直してください。

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

2016.11.12 14:31 | URL | #5uE6dEgY [edit]
あず先生 says...""

失礼いたしました。
こちらに質問させていただきました。
http://hatena-access.progoo.com/bbs/hatena-access_tree_p_6712.html

どうぞよろしくお願いいたします。

2016.11.13 03:52 | URL | #H6hNXAII [edit]
まつ says..."合計値の挿入について"

こんばんは。
お忙しいところ恐縮ですが、ご教示お願いします。

この方法でレポートを作成しましたが、
レポートが1ページの場合であっても複数ページであっても
必ず最後の二行に集計値を表示するにはどうすればよいのでしょうか?
---------------------
1ページの場合
1 a 100
2 b 200
3
4 合計 300
5 消費税 24
-------------------------
複数ページの場合
1ページ目
1 a 100
2 b 200
3 c 300
4 d 400
5 e 500
2ページ目
1 f 1000
2
3
4 合計 2500
5 消費税 200
--------------------------
どれとも
合計と消費税がページを跨ぐ可能性もあるため
フッターに表示したほうがいいのでしょうか?
よろしくお願いします。



2016.12.01 19:13 | URL | #ZbLLCUnQ [edit]
hatena says..."re:合計値の挿入について"

> この方法でレポートを作成しましたが、

1ページ目と2ページ目以降の行数がことなるということでしょうか。
下記の出力例では行数は常に5行のようですが。

> レポートが1ページの場合であっても複数ページであっても
> 必ず最後の二行に集計値を表示するにはどうすればよいのでしょうか?
> ---------------------
> 1ページの場合
> 1 a 100
> 2 b 200
> 3
> 4 合計 300
> 5 消費税 24
> -------------------------
> 複数ページの場合
> 1ページ目
> 1 a 100
> 2 b 200
> 3 c 300
> 4 d 400
> 5 e 500
> 2ページ目
> 1 f 1000
> 2
> 3
> 4 合計 2500
> 5 消費税 200
> --------------------------
> どれとも
> 合計と消費税がページを跨ぐ可能性もあるため
> フッターに表示したほうがいいのでしょうか?

レコード件数が4件の場合、5件の場合はどのような出力にしたいですか。

2016.12.03 02:54 | URL | #5uE6dEgY [edit]
まつ says..."re:re:合計値の挿入について"

お世話になります。

> 1ページ目と2ページ目以降の行数がことなるということでしょうか。
> 下記の出力例では行数は常に5行のようですが。
例が悪かったようですみません。
実際には1ページ目28行、2ページ目以降が50行となっています。

> レコード件数が4件の場合、5件の場合はどのような出力にしたいですか。
どちらの場合も最終行の下に合計と消費税を付け加えたいのですが。

2016.12.03 07:03 | URL | #ZbLLCUnQ [edit]
hatena says..."re:re:re:合計値の挿入について"

お聞きしたかったことは、次にページに合計と消費税だけが表示されるレコード件数の場合はどうするのか、ということです。

レコード件数が27件または28件の場合、次のページに合計と消費税だけ出力することになりますが、それでいいのでしょうか。

1ページ5行で說明すると、

1ページ目
1 a 100
2 b 200
3 c 300
4 d 400
5 e 500
2ページ目
1
2
3
4 合計 2500
5 消費税 200

というような出力でいいのでしょうか。
個人的には違和感があります。

> 合計と消費税がページを跨ぐ可能性もあるため
> フッターに表示したほうがいいのでしょうか?

上記と同じことを心配されているのだと思いますが、
どのようなレポートなのか不明なのですが、
納品書とか請求書なら、ヘッダー部分に表示するのが
一般的だと思います。

そうでないなら、最後のページのページフッターに表示という仕様かな。

2016.12.03 09:10 | URL | #5uE6dEgY [edit]
まつ says..."re:re:re:re:合計値の挿入について"

お返事ありがとうございます。
> 1ページ目
> 1 a 100
> 2 b 200
> 3 c 300
> 4 d 400
> 5 e 500
> 2ページ目
> 1
> 2
> 3
> 4 合計 2500
> 5 消費税 200
>
> というような出力でいいのでしょうか。
> 個人的には違和感があります。
>

仰る通り違和感ありありですね。

> 納品書とか請求書なら、ヘッダー部分に表示するのが
> 一般的だと思います。
>
> そうでないなら、最後のページのページフッターに表示という仕様かな。

はい、既にヘッダー部分には合計も消費税もございますが、
内訳最終行にもそれが必要でしてこのようなことになっております。
この「最後のページのページフッター」を取得する方法をお教え願えないでしょうか。
よろしくお願いします

2016.12.03 10:05 | URL | #ZbLLCUnQ [edit]
hatena says..."re:re:re:re:re:合計値の挿入について"

> この「最後のページのページフッター」を取得する方法をお教え願えないでしょうか。
> よろしくお願いします

ヘッダーの合計、消費税を表示しているテキストボックス名を txt合計, txt消費税 として、
ページフッターに配置したテキストボックスのコントロールソースを下記のように設定します。

=IIf([Pages]=[Page],[txt合計],Null)

=IIf([Pages]=[Page],[txt消費税],Null)

総ページ数=カレントページ数 で判断してます。

2016.12.03 12:04 | URL | #5uE6dEgY [edit]
まつ says..."re:re:re:re:re:re:合計値の挿入について"

いろいろとありがとうございました。なんとかできそうです。
またよろしくお願いします。

2016.12.03 16:16 | URL | #ZbLLCUnQ [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/311-01631ff1
該当の記事は見つかりませんでした。