• ベストアンサー

Excelでの印刷に関して

EXCEL VBAのご質問させていただきます。 このサイトは、いつも拝見させていただき、学習させていただいています。 シート1枚で売上リストを構成し、ボタンを押すと、ある日付の表を印刷するようにしております。 印刷のテンプレートは異なるシートで作っていて、そちらにコピー貼り付けで表示されるようにしております。 印刷の方は25行に売上データが入るようにしておりますが、例えばある日の売上が30行あると2ページにわたって 印刷されるようにしています。 そこで、1枚目には25行までの小計、2枚目には残り5行の小計と、2ページすべての合計を表示したいと思っています。 また、1ページと2ページにわたった売上の通し番号も左端に表示できるようにしたいです。 ボタンを押して、以上のことが実現できるコードを書くにはどうすれば良いでしょうか?

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

  • ベストアンサー
回答No.2

こんにちは とりあえず、アドバイスだけさせてもらいます。 ちょっと考えてみてください。 >例えばある日の売上が30行あると2ページにわたって印刷される >ようにしています。 2ページ出力される処理はどのようにしているのでしょうか? 一回で売上の内容全てを貼り付けて、印刷を指示するとエクセルの 印刷機能によって2ページ出力されるような形でしょうか? 小計、合計を表示させたいのなら、以下のような手順にしてみては どうでしょうか?  1ページ分の固定フォーマットを作成(一番下に小計・合計欄も作る)して、 ページ数だけ印刷指示を行うようにする。 【手順】 (1)何ページあるか確認して変数に入れます。※1 (2)小計、合計の変数を用意します。 ゼロクリアしておく (3)ページの回数だけ25行づつ貼り付けて印刷します。 (最終ページも25行貼り付けます。 最終行以降が空白であることが条件)  <繰り返しの処理>  For i = 1 to 最終ページ    25行の売上をコピー※2(別の変数を用意して現在の位置を指定)    出力フォーマットに値ペーストする※3    左端のセルに i (ページ数)を入れる    小計を計算して小計欄に入れる※4    合計 = 合計 + 小計 で計算する    最終ページであれば合計を合計欄に入れる    印刷の指示    売上の欄をクリア    次の位置を示す変数の設定※2  next i (4)小計・合計欄をクリアする ※1 最終ページ = Application.WorksheetFunction.RoundUp(Worksheets("Sheet1") _ .Range("A65536").End(xlUp).Row / 25, 0) ※2  jという変数を用意して、For文の前で1を設定しておく Range(Cells(i + j - 1, 1), Cells(i + j + 23, 5)).Copy 上記は、i=1,j=1の時、"A1:E25"の範囲をコピーします。 next iの直前に、jに24を足すと次の"A26:E50"の先頭が指定できます。(i=2,j=25) ※3 Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, _ SkipBlanks:=False,Transpose:=False ※4 小計 = Application.WorksheetFunction.Sum(Range("E3:E27")) E3:E27は売上の25行の範囲です。 フォーマットにあわせて変更 何かあれば補足してください。 ご参考まで

CYROP
質問者

お礼

nayuta_lotさん、ご回答ありがとうございます。 質問の仕方に具体的なものがなかったことをお詫びいたします。 すごく参考になりました。ありがとうございました。 >2ページ出力される処理はどのようにしているのでしょうか? >一回で売上の内容全てを貼り付けて、印刷を指示するとエクセルの >印刷機能によって2ページ出力されるような形でしょうか? ここの部分だけ、簡単な補足をさせていただきます。 処理は、For NextステートメントとIF Thenステートメントを利用しております。 印刷対象となる売上データが30あるとします。 印刷用のシートでは、25行分しかないので、最初の25こまでの データを貼り付けて、その時に印刷を行います。 ここで、一旦印刷部分はデータをクリアにします。 次の2回目の処理は、残りの5行分を2ページとして印刷を行う形にしております。 ただ、合計だけを最後のページに印刷したいと思ったのですが、 単にセル内にSUM関数を入れただけでは、そのページ分しか計算されませんので、何かよい方法がないかと思った次第でした。 以上です。 ご教授していただいて、とても感謝しております。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

>コードを書くにはどうすれば良いでしょうか コードを書いてくださいと言う風になっていて、丸投げです。このコーナーの規約違反。 ーー 言っていることは何にも技術的に難しくないのに、書いてくれとは。 もっと失敗も含めて、やってみて、どこがうまく行かないか絞らないと。 Sheet2の見出しや罫線、書式は別にして(第1-4行に収まるとして)、明細25行は第5行から第30行までのように決める。 ただし25行+合計1行。 データを第5行から順にセットして、カウンタを+1するか 30行を超えたら、 第2ページの見出しで必要な5行(例えば)を飛ばした 36-59行を2ページ目明細行として第36行から順次データをセットしていけばよい。 連番も、1行データをセットするごとに+1増やして番号列にセットする。 合計も各行の計数をつど足しこんでゆく。 ーー 抜き出した(この辺は質問ではっきりしないが)データが終われば、合計をセットすればよい。すぐ下行か、最終行のすぐ下か、または明細第26行目にセットする(これも質問に書いてない)。 その印刷シートの印刷は25行を超えておれば Range("A1:H30).Printout 超えておれば、続けて Range("A31:H55).Printout を書く。 A1.H30,Å31,H55などは質問者が計算してください。どうせ本件では固定になるから何も難しくない。 後はデータ部分をクリアしておき、次の回の作業に備える。 次の回の繰り返し処理が有るのかどうかも質問でははっきりしない。 ーー プログラムを書くのに必要な、シート、行、列の実例が書いてなくて 質問しているということ。

CYROP
質問者

お礼

ご指摘の内容、ありがとうございます。 こちら、言葉足らず、そしてサンプル内容も書かないで、回答していただける方へ、不親切であったと感じます。 コードの書き方と書いたのがだめでした。工夫のヒントが欲しかったもので、そのように書けばよかったです。 次回からは、ちゃんと分かってもらえるように書かせていただきます。 叱咤していただき、感謝いたします。

関連するQ&A