Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(その他 : Access 2010)
レポートでグループごと1ページだけ印刷されるようにしたい
投稿日時: 20/12/16 19:15:20
投稿者: 滝沢

顧客cd|日付|報告内容
 
上記のような、顧客への訪問報告書のデータベースがあります。
顧客によって訪問回数や報告内容の文字数にばらつきがあります。
このデータベースを元に、各顧客ごと最近の報告から1ページに収まる分だけ印刷したいです。
1ページ目:顧客A
2ページ目:顧客B
 :
といった感じです。
このようなことは可能でしょうか?
 
ちなみに、当初、上記レポートをサブレポートとしてページフッタに貼る
という方法で、サンプルデータで試した時点ではうまくいったのですが、
本番データは量が多すぎたせいか、処理ができませんでした。
(印刷に数日かかりそうなスピードで、途中で固まってしまう)
 
サブレポートでなければ処理が重すぎるということはありませんが、
1顧客1ページにする方法がわかりません。
 
よろしくお願い致します。

回答
投稿日時: 20/12/17 08:52:22
投稿者: Suzu

現状、どのような手法を用いて実現しようとされているのか、文章からだけでは読み取ることができません。
 
手法として思いつくのが
・MoveLayoutプロパティ
・NextRecordプロパティ
・PrintSectionプロパティ
あたりを組み合わせて、と言うのは思いつきますが
 
サブレポートとの事なので、違うのでしょうね。
 
ですので「途中で固まる」原因も推測のしようがありません。
 
 
レコードソース側で処理してはいけないのでしょうか?
 
SELECT テーブル名.顧客CD, テーブル名.日付, テーブル名.報告内容
FROM テーブル名 INNER JOIN
  (
    SELECT 顧客CD, MAX(日付) AS 最新日
    FROM テーブル名
    GROUP BY 顧客CD
  ) AS TMP
      ON (テーブル名.日付 = TMP.最新日) AND (テーブル名.顧客CD = TMP.顧客CD);

回答
投稿日時: 20/12/17 11:02:57
投稿者: hatena
投稿者のウェブサイトに移動

レポートのグループ化機能で、グループヘッダーを表示させて、グループヘッダーの「改ページ」プロパティを「カレントセクションの前」に設定すればいいでしょう。

回答
投稿日時: 20/12/17 11:59:16
投稿者: Suzu

引用:
各顧客ごと最近の報告から1ページに収まる分だけ印刷したいです。

 
すみません。上記を見落としておりました。
 
1. 1ページあたりに印刷する件数の上限は決まっていますか?
2. 顧客CD、日付、報告内容 を表示する 各テキストボックス の
      「印刷時拡張」、「印刷時縮小」プロパティーは 【いいえ】でしょうか?

回答
投稿日時: 20/12/17 13:26:41
投稿者: hatena
投稿者のウェブサイトに移動

引用:
各顧客ごと最近の報告から1ページに収まる分だけ印刷したいです。

 
私も見落としてました。
 
下記で紹介されている方法で、グループ毎の連番を入力しておきます。
 
グループ毎連番を自動入力する関数 - hatena chips
https://hatenachips.blog.fc2.com/blog-entry-428.html
 
1ページに収まる件数で連番に抽出条件を設定したクエリを作成します。
 
これをレポートのレコードソースにします。
 
もし、印刷時拡張で1行のサイズが変更する場合は、件数を多めに設定しておいて、1ページからはみ出す分はVBAで出力をキャンセルするようにすればいいでしょう。

投稿日時: 20/12/18 14:22:19
投稿者: 滝沢

Suzu様、hatena様
コメントありがとうございます。
返信が遅くなり申し訳ありません。
 
>1. 1ページあたりに印刷する件数の上限は決まっていますか?
決まっていません。
 
>2. 顧客CD、日付、報告内容 を表示する 各テキストボックス の
>「印刷時拡張」、「印刷時縮小」プロパティーは 【いいえ】でしょうか?
印刷時拡張:はい
印刷時縮小:いいえ
としています。
 
>もし、印刷時拡張で1行のサイズが変更する場合は、件数を多めに設定しておいて、
>1ページからはみ出す分はVBAで出力をキャンセルするようにすればいいでしょう。
そんな事ができるんですか。。
 
なにとぞよろしくお願い致します。

回答
投稿日時: 20/12/18 15:35:43
投稿者: Suzu

引用:
>1. 1ページあたりに印刷する件数の上限は決まっていますか?
決まっていません。
 
>2. 顧客CD、日付、報告内容 を表示する 各テキストボックス の
>「印刷時拡張」、「印刷時縮小」プロパティーは 【いいえ】でしょうか?
印刷時拡張:はい
印刷時縮小:いいえ
としています。

 
・顧客 CD毎の 件数が不定
・印刷時拡張・縮小 を使用している
 
との事なので、VBAで処理が早いですね。
 
 
顧客CD をヘッダーとして、配置
日付 は、 降順にて並べ替え
 
を設定し、VBA にて、
 
ヘッダーフォーマット時に、そのページヘッダーを印刷するページが何ページ目かを取得。
詳細セクションのフォーマット時に、取得したページ数と違う際には、
  詳細セクションのフォーマットをキャンセル。
 
引用:
Dim i As Long
 
Private Sub グループヘッダー0_Format(Cancel As Integer, FormatCount As Integer)
    i = Me.Page
End Sub
 
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
    If Me.Page = i Then
    Else
        Cancel = True
    End If
End Sub

投稿日時: 20/12/21 11:38:59
投稿者: 滝沢

Suzu様
コメントありがとうございます。
 
>顧客CD をヘッダーとして、配置
>日付 は、 降順にて並べ替え
>を設定し、VBA にて、
>ヘッダーフォーマット時に、そのページヘッダーを印刷するページが何ページ目かを取得。
>詳細セクションのフォーマット時に、取得したページ数と違う際には、
> 詳細セクションのフォーマットをキャンセル。
 
この通り設定して、希望通りの動作になりました。
スピードも問題ありません。
コードの意味もなんとなく理解できました。
非常に助かりました。
 
Suzu様、Hatena様 ありがとうございます。