アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (11件中1~10件)

私の設定は「T_出荷明細」でレポートを


作成したので、No7は必要ないですね。

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


補足について:

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

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

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

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

(2)
>あとループも止まりません。
これはどのような状況ですか。
    • good
    • 0
この回答へのお礼

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

なるほど、やはり改ページコントロールの


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

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

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

連続ですみません。


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

Me![出荷No].Visible = True



Me![出荷No].Visible = blnVisible

として、他のフィールドと同じに
表示すれば見栄えもいいかもしれません。
    • good
    • 0
この回答へのお礼

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

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

No6で抜けていました。



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

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

質問のコード内容には問題はまったく無い


と思いますが。

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

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

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

直線nextrecord ???



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

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

この回答への補足

piroin654さん

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

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

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

補足日時:2011/03/09 12:44
    • good
    • 0

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



より簡単な方法です。

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

レコードがない場合も用紙の最後まで罫線を出力する NextRecord版
http://hatenachips.blog34.fc2.com/blog-entry-91. …
    • good
    • 0
この回答へのお礼

bonaronさん

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

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

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

お礼日時:2011/03/09 12:48

No1で、



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

としていますが、

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

です。
    • good
    • 0

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



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

は、

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

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

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

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

関連するカテゴリからQ&Aを探す