• ベストアンサー

エクセル 不確定なページ数に対応して印字を

説明しづらいのですが、 エクセルで処理する時によってデータ数が不確定で、それにより 出力するページ数が変わります。ページは表形式でタイトルや 罫線などが入っています。 1ページ分だけをレイアウト(罫線)しておいて、仮に2ページ 以上のデータがあった場合でも、レイアウトは1ページ目を引き継ぐ と言うような方法はあるでしょうか。 1ページMax30件分の罫線の入った表がシートAに作成して あります。シートBにはデータのみが入っていて、それをシートAが 参照しています。 シートAのA1セル=シートB1!C3 30件以内であれば1ページに収まるので、そのまま印字で罫線 などの入った状態で出力可能ですが、それ以上は2ページ目に入り ます。何ページ分になるか判らないので、1ページ目と同様のレイアウトを 作っておくわけには行きません。 長文で判りづらい説明だと思いますが、何卒ご教授下さい。   

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

  • ベストアンサー
  • nobu555
  • ベストアンサー率45% (158/345)
回答No.5

>1枚目、1~35 >2枚目、31~35の後に25行の空白行、その後にまた31~35 >と出力されました。 こちらでは現象が、確認できませんので、 とりあえず、シートAを白紙の状態で試してください。 また、35行転送したいのであれば、 2行目を 最大ページ = Application.RoundUp(((データ数 - 2) / 35), 0) - 1 4行目を Range(Cells(3 + 35 * 印刷回数, 3), Cells(37 + 35 * 印刷回数, 3)).Select としてください。

ogaki_3ok
質問者

お礼

いろいろとありがとうございました。 回答者様のアドバイスを元に試行錯誤して 何とか形にすることが出来ました。

その他の回答 (4)

  • nobu555
  • ベストアンサー率45% (158/345)
回答No.4

No.2です。 >ご記入いただいたものをそのままコピーしてやってみた結果ですが、 >"シートA"の1行目から30行目がクリア(データも)され、 >31行目以降が2枚同じものが出力されました。 データ元(コピー元)の出だしを”C3”に設定してありますので、 データ元の位置を確認してください。 または、4行目(下記の行)の数字を変更して、 質問者さんで調整してみてください。 Range(Cells(3 + 30 * 印刷回数, 3), Cells(32 + 30 * 印刷回数, 3)).Select 尚、カッコ内は、(行,列)となります。 例、(3,3)はC3、(32,3)はC32です。

ogaki_3ok
質問者

補足

ありがとうございます。 "シートB"の"C3"セルに「1」を、以下"C4"セルに「2」 "C5"セルに「3」・・・"C37"セルに「35」。 "シートA"の"A1"セル=シートB!C3、 以下"A2"セル=シートB!C4、"A3"セル=シートB!C5、 ・・・"A35"セル=シートB!C37。 で実行したところ、 1枚目、1~35 2枚目、31~35の後に25行の空白行、その後にまた31~35 と出力されました。 きっと私の設定か何かが間違っているのですね。

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

質問は何を言っているのか、わかりにくい。 仮の実例でも上げて記述しては。 プログラム(特にアクセスなどデータベース)をやると、データベースのデータには、印刷する時の様式は持ち込まない。 1ページ分の(見出しなど不動文字は書き込まれた、仮想の)透明シート(を想像してください。そこに)にデータを差し込んで、1ページ分埋まったら、印刷、そして透明シートのデータを消去し、また透明シートに次ぎのデータを差し込んで、1ページ分埋まったら、印刷、とデータが終わるまで繰り返すイメージです。最後は単位未満の端数行ができますが。 エクセルなら印刷シート(1ページ分)を別の独立シートとしてつくり、簡単なマクロでページ番号を変化させて、自動印刷するという仕組みにするのが、判りやすい。 例えばSheet1のA1:A13のデータ行(見出しとか空白など中間に混じりけ行が無し)が有るとして、 例データ 1 2 3 4 5 6 7 8 9 10 11 12 13 Sheet2を印刷シートとして 3行ずつ1ページに納めるなら、ページ番号を Sheet2のA1に有るとして,Sheet2の印刷シートの各行には =INDEX(Sheet1!$A$1:$A$200,($A$1-1)*3+ROW()-2,1) と入れて3行複写しておく。 離れたセルに有る場合は =INDEX(Sheet1!$A$1:$A$200,($A$1-1)*3+1,1) =INDEX(Sheet1!$A$1:$A$200,($A$1-1)*3+2,1) =INDEX(Sheet1!$A$1:$A$200,($A$1-1)*3+3,1) とデータを差し込みたいセルに式を入れておく。 見出しなぞも印刷シートだけに適当なセルにセットしておく。 Sheet2のA1に 1を入れると1,2,3 2を入れると4,5,6 ・・・ と変化します それをその時々で手動で印刷しても良いし、VBAでA1を1,2,3・・と変化させて、印刷範囲(例A2:C10)をRange("A2:C3").PrintOutで印刷すればよい。VBAの部分はすぐには質問者にはできないかもしれないが。何回まで繰り返せばよいかはプログラムで組めます。 こういうのを考えると、仕事でエクセルを使うには、自動化したくなり、VBAの利用が必要というのが私の持論です。 ただ上記に紹介したのはVBAと関数の折衷版です。経験が進めばVBAだけでやります。 -

  • nobu555
  • ベストアンサー率45% (158/345)
回答No.2

以前、同じようなマクロを作った事がありましたので、 下記を参考にしてください。 尚、”シートBのC3”から”シートAのA1”に30行コピーするようになっていますが、D列以後も必要であれば、 4行目の最後の”3”を変更すれば列数を増やすことが出来ます。 Sub 印刷() データ数 = Worksheets("シートB").Range("C65536").End(xlUp).Row 最大ページ = Application.RoundUp(((データ数 - 2) / 30), 0) - 1 For 印刷回数 = 0 To 最大ページ Range(Cells(3 + 30 * 印刷回数, 3), Cells(32 + 30 * 印刷回数, 3)).Select Selection.Copy ActN = ActiveSheet.Name Sheets("シートA").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("シートA").Select ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Sheets(ActN).Select Range("A1").Select Next End Sub こんな感じですが、如何でしょうか。

ogaki_3ok
質問者

お礼

ご記入いただいたものをそのままコピーしてやってみた結果ですが、 "シートA"の1行目から30行目がクリア(データも)され、 31行目以降が2枚同じものが出力されました。 私のマクロの設定に問題があるのでしょうか?。

ogaki_3ok
質問者

補足

ありがとうございます。 早速試してみます。 もし追加で補足・不明がある場合は、勝手な都合ですが 月曜日に書込みさせていただきますので、本当に申し訳ないですが お付き合い願えないでしょうか。 よろしくお願いいたします。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

件数が不定と言っても、最大件数がある筈です。 例えば「どんなに多くなっても、最大で140件、5ページ目の半分まで」とか。 そしたら、1ページ目と同じレイアウトの物を、コピー&ペーストで5ページ目まで作ってしまいます。 この時、シートAの表は2行目から作ります。1行目は空けておいて下さい。 もちろん、1ページ目はシートBの1~30件目を、2ページ目はシートBの31~60件目を参照するようにします。で、最大で140件分、5ページ目まで参照するようにします。 次に、シートAの印刷範囲を設定します。A列からG列に表があり、最終ページが201行目だった場合、印刷範囲はA2~G201にします。 次に、印刷範囲の外、例えばH列の全セルに「その行のページ番号」を入れます。 例えば、レイアウトした表の1ページ目が2~41行なら、H2~H41に「1」を入力し、2ページ目が42~81行なら、H42~H81に「2」を入力します。これを最後のページの最後のH201まで入れておきます。使わずに空けてあった1行目のH1セルには、文字で「ページ数」と入力しておきます。 次に、H列を全選択して、オートフィルタを設定します。 これで、雛形となる原型のブックの完成です。保存しておきましょう。 実際にデータを入れて印刷する時は、以下のようにします。 まず、シートBのデータ入力が終わったら、シートAが何ページ目まで行ったか見ます。シートAのH1セルの所のオートフィルタの▼マークをクリックし「(すべて)」を選びます。 もし70件入力していたら、3ページ目の上から10件目まで埋まっていて、4ページ目はデータが無い状態です。 そうしたら、H1セルの所のオートフィルタの▼マークをクリックし「(オプション)...」を選びます。 フィルタ条件の入力画面になるので「3」「以下」にしてOKボタンを押します。 すると、4~5ページ目が隠れて見えなくなるので、そのまま印刷します。すると、1~3ページ目のみが印刷されます。 もし、入力件数が30件以下で1ページしか無ければ、フィルタ条件の入力画面で「1」「以下」にすれば1ページ目以外が隠れます。 もし、入力件数が多くて5ページ全部印刷する時は、フィルタ条件の入力画面で「5」「以下」にするか、オートフィルタの▼マークをクリックし「(すべて)」を選びます。 この例は簡易版で、自分でフィルタ条件を入力して何ページ目まで見せるか指定、と言うことをしていますが、応用すれば「何件目まで入力してあるか自動判定し、不要なページをボタン1つで隠せる」と言うのも作れます。

関連するQ&A

専門家に質問してみよう