- 締切済み
ACCESSで明細を印刷する方法を教えて下さい。
ACCESSで明細を印刷する方法を教えて下さい。 利用環境はWindowsXP、ACCESSは2002 SP3です。 5000人程の利用者名データと、 利用者毎の利用履歴データ(1人あたり1~200件)が入ったテーブルがあります。 この度、各利用者宛てに明細を送ることになりました。 印刷する用紙と内容が決められていて、 A4縦の用紙の左上に送付先宛名と総ページ数を印刷する欄、 中段に明細行(15行まで)、 下段に中段と全く同じ明細行(お客様控え用)を印刷する欄を設けることになっています。 レポートやフォーム、サブレポート等を使えば実現できるのではないかと思っていますが、 Accessはテーブルと選択クエリーしか触ったことがなかく、方法が分からずに困っています。 実現したいことは上記の通り、 ・用紙の左上には「宛名」を表示。明細が15行を超える人の場合、「現ページ/総ページ」も表示したい ・1件しか利用履歴が無い場合でも、人が変わればページを変えたい ・利用明細行は15行までとして、同じ人でも16行目以降は次ページにしたい(次ページで再び「宛名」を印字) ・明細行は全く同じものを上下に2個(最大15行×2になります)配置したい です。 人ごとにページを変える方法は何とかできましたが、明細行の改ページが上手くいきません。 明細行のあるサブレポートの表示枠を小さくすると、表示を15行に抑えることはできますが、 16行目以降は印刷されず、次の人になってしまいます。 枠のサイズを変える以外にページを変える方法はありますか? うまく説明できずに申し訳ありませんが、急に指示されたため、困っているところです。 なにとぞよろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- shinkami
- ベストアンサー率43% (179/411)
前回メニュー画面の添付が出来ていなかったのであらためて添付します。 この現象はたまに発生します。 何故なんでしょうね 前回説明が足らなかったようなのであらためて >15行分の高さのサブレポートを(2段分)用意するということでしょうか。 >下段に中段と全く同じ明細行(お客様控え用)を印刷する欄を設けることになっています。 顧客抽出TBLを基に主レポート(利用履歴RPT) 利用履歴抽出TBLを基に副レポート(利用履歴RPTSUB、利用履歴RPTSUB副) ・利用履歴RPTSUB副は利用履歴RPTSUB をコピーします。 利用履歴RPT ・ページヘッダーに送付先宛名とページ/総ページ数 ここでのページは15行単位で分割するためブロック単位でリセットされます。 最初のブロックの総ページ数は送付対象の顧客数になります 詳細欄に ・利用明細の見出しとメニューのform!メニュー!ページNo. ・利用履歴RPTSUB ・お客様控えの見出しとメニューのform!メニュー!ページNo. ・利用履歴RPTSUB副 お客様単位の総ページ数を印刷するには 顧客TBLにご利用回数フィールドを追加しこれの1/15(切上げ)を印字
- shinkami
- ベストアンサー率43% (179/411)
お待たせしました。 サイトのご紹介有難うございます。これから見させていただきます。 >15行分の高さのサブレポートを(2段分)用意するということでしょうか。 >>下段に中段と全く同じ明細行(お客様控え用)を印刷する欄を設けることになっています。 中段の御社用と下段のお客様控え用です > 明細に行No.が付いていれば印字対象を15以下と15超にする > 明細に行No.が付いていなければ明細テーブルに印刷コントロールのフィールドを追加する 利用テーブルに「ご利用回数」といったフィールドを増やして 1.今までのデータはエクセルにエキスポートして、メンテして履歴IDとご利用回数だけの テーブルにインポートし、これで利用履歴テーブルをUPDATEする 2.新しいデータは履歴登録の仕組みに組み込む さて本題ですが 少し仕掛けをして何とかなりそうです。 ただデータを分割処理するので後で名寄せが必要です。 1.利用履歴を行No.で分割保存する利用履歴抽出TBL 追加 項目は利用履歴IDを外して他は同じ項目で主キー無し 2.利用履歴抽出TBLに対応する顧客抽出TBL 項目は顧客TBLで顧客IDの主キー設定を外し 、顧客IDのデーター型を長整数型 インデックスに重複なし 3.メインレポートの基になるテーブルを顧客抽出TBL サブレポート1、サブレポート2の元になるテーブルを利用履歴抽出TBL 4.レポートの起動はメニューフォーム上のレポート名のクリックイベントで データーを分割抽出してから起動する 5.その他 テーブルの項目名は適当に考えました。 *メインフォームに配置するボックス ・起動レポート名 ラベル ・ページNo.、開始No.、終了No. テキストボックス これで起動レポート名をクリックする都度15行単位で分割してレポートして ページNo.がカウントアップし次のクリックを待ちます。 *メインフォームのコード Option Compare Database Option Explicit Private Sub Form_Load() ページNo. = 1 End Sub Private Sub 利用履歴発行_Click() 利用履歴発行RTN ページNo. = ページNo. + 1 End Sub Private Sub 利用履歴発行RTN() 終了No. = ページNo. * 15 開始No. = 終了No. - 14 DoCmd.SetWarnings False DoCmd.RunSQL ("delete from 履歴抽出TBL ;") DoCmd.RunSQL ("insert into 履歴抽出TBL(顧客ID,行No.,利用日,利用内容) " _ & " select 顧客ID,行No.,利用日,利用内容 from 履歴TBL where 行No. >= 開始No. and 行No. <= 終了No.; ") DoCmd.RunSQL ("delete from 顧客抽出TBL ;") DoCmd.RunSQL ("insert into 顧客抽出TBL(顧客ID) select 顧客ID from 履歴抽出TBL ; ") DoCmd.RunSQL ("Update 顧客抽出TBL Inner Join 顧客TBL On 顧客抽出TBL.顧客ID = 顧客TBL.顧客ID " _ & "set 顧客抽出TBL.顧客名=顧客TBL.顧客名,顧客抽出TBL.郵便番号=顧客TBL.郵便番号 " _ & " ,顧客抽出TBL.都道府県=顧客TBL.都道府県,顧客抽出TBL.市区町村=顧客TBL.市区町村; ") DoCmd.SetWarnings True DoCmd.OpenReport "利用履歴RPT", acViewPreview End Sub 動作確認しました。 ここの説明はきりがありませんので省かせていただきます。 ある程度ご理解いただけたらこのURLを付けて新規に質問されると 他の人の別のアドバイスも頂けるのでは
- shinkami
- ベストアンサー率43% (179/411)
こんばんは、色々勉強させてもらってます。 >「任意の行で改ページをしたい」 この意味が理解できなくて飛ばしました。 何か条件があるだろうと 15行を越えると次ページと理解してよろしいですね サブレポート(主レポート内)のプロパティーの書式タグの下の方に 印刷時拡張、印刷時縮小があります。 規定値は両方とも「はい」 このときは行数によってフレームが伸縮します。 今回は印刷時縮小は「いいえ」ですね 1)印刷時拡張「はい」のままにするとフレームが伸びて全ての明細が印字されます。 控えのサブレポートがページ内に収まらないときはサブレポート単位で次ページへ移ります。 2)印刷時拡張「いいえ」にするとフレームに入らない明細は無視されます。 サブレポートのフレーム高さを15行分にして 明細の印字対象を二つに分けて印刷しては 明細に行No.が付いていれば印字対象を15以下と15超にする 明細に行No.が付いていなければ明細テーブルに印刷コントロールのフィールドを追加する
- shinkami
- ベストアンサー率43% (179/411)
こんなの初めてです。 苦し紛れでやりましたので、他にもっとよい方法があるかと思いますが 仕訳伝票テーブルと仕訳明細テーブルで試してみました。 1.仕訳伝票テーブルで単票形式の仕訳伝票レポートを作ります。 2.仕訳明細テーブルで帳票形式の仕訳明細レポートサブを作ります。 3.仕訳伝票レポートの必要な項目を詳細枠に移動します。 4.仕訳明細レポートサブを仕訳伝票レポートのサブとしてサブレポートツールを用いて 仕訳伝票レポートに2度縦に並べて配置します。 5.サブレポートの項目見出しは表示されませんので、仕訳伝票レポートにラベルを追加します。 ※仕訳伝票テーブルと仕訳明細テーブル1:n のリレーション設定し照ります。 色々勉強させていただきました。
お礼
shinkamiさん、ありがとうございます。 大変申し訳ありませんが、ご回答頂いた方法は私でも最初から試しています。 ただしサブレポートでは改ページが制御できません。 「任意の行で改ページをしたい」と言う点については、 「わからない」というご回答ということですね。 お時間を割いて頂きありがとうございました。
- bonaron
- ベストアンサー率64% (482/745)
レポートに関してはトップクラスの実力者 hatena さんのスーパーテクニックです。 明細を持つ伝票とその複写を同じページに2分割して表示する http://hatenachips.blog34.fc2.com/blog-entry-233.html?cat-4 ちょこっと修正すれば使えるでしょう。
お礼
bonaronさん、こんばんは。ありがとうございます。 現在の知識ではちょっと内容が難しいですが、 今日明日で頑張って理解してみます。
お礼
shinkamiさん、こんばんは。 何度もありがとうございます。 > この意味が理解できなくて飛ばしました。 すみません、私の説明が下手でした。 改ページは「顧客別」「行数別」に発生させようと思っています。 同じ「顧客」でも15行を超える利用履歴をお持ちのお客様は、 1行目から15行目はでは1ページ目に印字。 16行目から30行目までを2ページ目に印字。 31行目からは3ページ目に。といった具合です。 顧客が「Aさん」から「Bさん」に変わったら、そのタイミングでまた改ページ。 「Aさん」が35行、「Bさん」が24行の明細を持っていたとしたら、 「Aさん」は4ページ(4ページ目は5行のみ)、「Bさん」は3ページ(3ページ目は4行のみ) としたいと考えています。 社名やロゴの入った用紙が既に印刷されていて、15行分の罫線が2段分(発送用と返送用)用意されている用紙なのです。 15行分の「空の罫線」が引かれた用紙に、うまく位置を合わせて印字したいのです。 このご回答を頂いたあと、「なるほど」と思い、 http://office.microsoft.com/ja-jp/access-help/HA001149472.aspx を見てみました。 確かに、「印刷時縮小」は関係がなさそうですね。 無駄な動き(行の削除)を避けるためにも、「いいえ」にしておいたほうがよさそうです。 ただ、「印刷時拡張」が知識不足のため、うまく把握できません。 「印刷時拡張」プロパティを「いいえ」にして、 15行分の高さのサブレポートを(2段分)用意するということでしょうか。 拙いながらも試してみたところ、確かに15行目までの印字になりますが、 次ページは16行目からの印字ではなく、Bさんの1行目から印刷されてしまいます。 (つまり、16行目から35行目が無視される) もう少しお付き合い頂ければ幸いです。 特に、 > 明細に行No.が付いていれば印字対象を15以下と15超にする > 明細に行No.が付いていなければ明細テーブルに印刷コントロールのフィールドを追加する の部分をどう実現したらよいのかがわかりません。 明細テーブルに、顧客ごとの明細に連番を付与して、VBAで制御するということでしょうか? お時間があるときで結構ですので、 詳しく方法を教えて頂ければ幸甚に存じます。 宜しくお願い致します。