こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

access レポートで罫線を最後まで出力する方法

accessのbvaの本を参照してレコードがない場合でも最後まで罫線を出力する方法を試しているのですが、インクリメントがうまくいっていないのかいつまでも改ページを続けてしまいます。

どなたか解決する方法を教えてください。

Option Compare Database
Option Explicit
'次の3つの変数はdeclarationセクションで宣言します
'現在印刷中のレコード番号を表す変数
Private pintRecord As Integer

'レコードソースの全レコード数を表す変数
Private pintRecordMAX As Integer

'1ページ当たりに印刷するレコード数の定数
Private Const cintRecperPage As Integer = 15

Private Sub グループヘッダー0_Format(Cancel As Integer, FormatCount As Integer)

'現在印刷中のレコード番号を初期化します
pintRecord = 0

'レコードソースの全レコード数を取得します
pintRecordMAX = DCount("*", "T_出荷明細", "出荷No=reports![R_出荷証明書3 test]![出荷No]") '"*"にすることでクエリ内のレコード数をカウント。Null値フィールドを含むレコードも対象。

End Sub


Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)

'各テキストボックスの可視/非可視のフラグ
Dim blnVisible As Boolean

'現在印刷中のレコード番号をインクリメントします
pintRecord = pintRecord + 1

If (pintRecord Mod cintRecperPage) > 0 Then
'1ページ内の途中のレコードを印刷している場合

'改ページしないようにします
Me!bpage.Visible = False

'印刷するレコードの位置によって、各テキストボックスの可視/非可視の
'フラグと、次レコードへ進めるかどうかの設定を行います

If pintRecord < pintRecordMAX Then
blnVisible = True
Me.NextRecord = True

ElseIf pintRecord = pintRecordMAX Then
blnVisible = True
Me.NextRecord = False

Else
blnVisible = False
Me.NextRecord = False

End If

Else
'1ページ内の最後のレコードになったとき

If pintRecord <= pintRecordMAX Then
'まだ印刷するレコードが残っているときはその行を印刷後、改ページします
blnVisible = True
Me!bpage.Visible = True

Else
'印刷するレコードがもうないときはその内容は印刷しません
blnVisible = False

End If

End If

'フィールドと連結したテキストボックスの可視/非可視を設定します
Me![品番].Visible = blnVisible
Me![品名].Visible = blnVisible
'Me![寸法使用].Visible= blnvisible
Me![数量].Visible = blnVisible
Me![備考].Visible = blnVisible

End Sub

投稿日時 - 2011-03-07 16:10:06

QNo.6575974

すぐに回答ほしいです

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

私の設定は「T_出荷明細」でレポートを
作成したので、No7は必要ないですね。

一応、フォームとT_出荷証明書とクエリを作成して
実行しました。ほぼ直すところは
なく正常に動くのですが。


補足について:

(1)
>行数が実際のレコード数が28であったら14行改ページ
>(ヘッダー除き)なので通常は2ページちょうどになる
>はずなのですが、1ページと13行になります。

これは、質問のコードの中で、

'1ページ当たりに印刷するレコード数の定数
Private Const cintRecperPage As Integer = 15

としているので、レコードが15行まで表示され、
15以上になると次のページに表示される、
ということなので、
>1ページと13行になります。
は正常ですが。

(2)
>あとループも止まりません。
これはどのような状況ですか。

投稿日時 - 2011-03-10 18:50:03

お礼

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行毎にきちんと改ページされていたので、勘違いに気づきました。


いろいろとありがとうございました。

投稿日時 - 2011-03-10 23:31:03

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(11)

ANo.11

なるほど、やはり改ページコントロールの
位置の問題でしたか。ループと聞いて
ひょっとしてと思って改ページコントロールの
位置をずらしてみて確認していたのですが、
他の問題があるのかと思っていました。

質問で提示されたコードはこのような場合の
模範コードのようなものですから、コードには
問題ないと思っていたのですが、解決はなによりです。

同じようなレポートを作成したいという人に
とってはこのコードは最高のサンプルになります。

投稿日時 - 2011-03-11 03:19:04

ANo.9

連続ですみません。
No8の続きですが、「出荷No」フィールドを
表示する場合、

Me![出荷No].Visible = True



Me![出荷No].Visible = blnVisible

として、他のフィールドと同じに
表示すれば見栄えもいいかもしれません。

投稿日時 - 2011-03-09 18:49:17

お礼

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行減っています。

あとループも止まりません。

投稿日時 - 2011-03-10 11:48:39

ANo.8

こちらの設定は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」をレポートのどこに設定するかの
問題だけだと思います。

投稿日時 - 2011-03-09 17:00:55

ANo.7

No6で抜けていました。

出荷Noヘッダのプロパティ:
改ページ  カレントセクションの前

です。内容はほぼNo1と同じです。

投稿日時 - 2011-03-09 15:11:16

ANo.6

質問のコード内容には問題はまったく無い
と思いますが。

レポートの作成過程を記しておきます。

(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)のようにしています。

なお、改ページコントロールの位置は
詳細セクションの中で、一番下方に設定
します。

投稿日時 - 2011-03-09 14:54:35

ANo.5

直線nextrecord ???

コード中の
Me.NextRecord = False
あるいは
Me.NextRecord = True
のNextRecordはレポートの NextRecord プロパティ
のつもりでしたが。
直線の名前を「直線100」のように変更してみて
ください。

こちらではコードはほとんど変更していない
状態で正常に表示されています。

投稿日時 - 2011-03-09 12:24:25

補足

piroin654さん

すみません直線nextrecordではなく

直線はnextrecordプロパティを用いて次のデータに行くMAXレコードになったときは、nextrecordに移動しないという設定にしていて、直線は出続ける設定になっています。

でした。打ち間違いです・・・。

投稿日時 - 2011-03-09 12:44:12

ANo.4

なかなか、 hatena さんが登場してこないので・・・

より簡単な方法です。

レコードがない場合も用紙の最後まで罫線を出力する
http://hatenachips.blog34.fc2.com/blog-entry-17.html

レコードがない場合も用紙の最後まで罫線を出力する NextRecord版
http://hatenachips.blog34.fc2.com/blog-entry-91.html

投稿日時 - 2011-03-09 11:43:44

お礼

bonaronさん

回答ありがとうございました。
hatenaさんは一度回答いただいていたのですが、事務局から削除されていました。

Hpも見させていただきましたが、弊社でもともと使用していたプログラムのエラー回避の為に行っているため、あまりにも変えてしまうと・・・という部分があったので本を見て作成していたところです。

その上で、わからない部分があったので質問を上げさせてもらいました。

投稿日時 - 2011-03-09 12:48:37

ANo.3

No1で、

(2) R_出荷証明書
ヘッダ:

としていますが、

(2) R_出荷証明書
セクション:

です。

投稿日時 - 2011-03-09 00:27:30

ANo.2

レポート名を「R_出荷証明書」としたので、

pintRecordMAX = DCount("*", "T_出荷明細", "出荷No=reports![R_出荷証明書3 test]![出荷No]")

は、

pintRecordMAX = DCount("*", "T_出荷明細", "出荷No=reports![R_出荷証明書]![出荷No]")

のようにしています。
これは影響はないですね。

投稿日時 - 2011-03-09 00:06:00

ANo.1

コードはとくに問題がないと思われるので、
コードはそのままにして、こちらでレポートの
設定をしたものを記しますと、

(1)
T_出荷明細:
出荷No
品番
品名



(2) R_出荷証明書
ヘッダ:
レポートヘッダ
ページヘッダ
出荷Noヘッダ
詳細
ページフッタ
レポートフッタ

並べ替え/グループ化:
出荷No 昇順
グループヘッダ はい
グループフッタ いいえ
グループごと  各値
グループ間隔  1
同一ページ印刷  しない

出荷Noヘッダのプロパティ:
改ページ  カレントセクションの前

レポートの詳細:
出荷No (表示が必要なければ「可視」を「いいえ」
品番
品名
(出荷Noがないとデータが表示されない)


以上の設定で15行直線コントロールを
表示し、レコードが15以上ある場合は
次のページに残りを表示しています。

上記の中で、
出荷Noヘッダのプロパティ:
改ページ  カレントセクションの前
の設定が抜けている、あるいは、レポートの詳細に出荷Noが
ないとかがあるのでは、と思われます

投稿日時 - 2011-03-08 23:56:00

補足

piroin654さん回答ありがとうございました。

改ページの設定はしないにしていても、カレントセクションの前にしていても変わりませんでした。

直線nextrecordを用いて次のデータに行くMAXレコードになったときは、nextrecordに移動しないという設定にしていて、直線は出続ける設定になっています。


pintRecordMAX = DCount("*", "T_出荷明細", "出荷No=reports![R_出荷証明書3 test]![出荷No]")
にしていたら、改ページする毎に1行行数が減る減少になっていて、きちんとしたMAX行がとれていませんでした。


pintRecordMAX = DCount("*", "T_出荷明細")にすることでいつまでもループし続ける現象は解消しました。

ただ、最終ページが最後まで罫線がひかれなくなりました。
この現象を解消する方法ありますか?

投稿日時 - 2011-03-09 10:56:07

あなたにオススメの質問