
■ 概要
タイトル行、明細行の組み合わせで作成するExcel表があったとして、明細が存在するページまでを印刷するようにします。ただし、VBA(マクロ)無しでです。
イメージはこんな所です。

全く同じ書式で3ページまで作成して、上から明細を入力。最後の明細のページまでを印刷範囲にしようとしています。
■ 仕込み
前提条件として、1ページの行数は同じにします(例は5行)。そうする事で、最終ページと行数から印刷を終了したい行を計算します。

今回は、印刷を終了したいページを手入力でセルK2に入力します。セルK3には、セルK2に入力した値と1ページの行数を掛けた値が表示されるようにします。
■ 印刷範囲について
次に、「ページレイアウト」→「印刷範囲」→「印刷範囲の設定」を選択して、適当な範囲(どうでも良い)を指定します。

続けて、「数式」→「名前の管理」をクリックします。

「名前の管理」画面が表示されます。

印刷範囲を指定する事で、自動的にPrint_Areaという名前が作られます。参照範囲には、先ほど指定したセル参照が表示されている筈です。
さて、このセル参照の書式ですが、良く計算式で使うのと同じ書式ですよね。ってことは、ここに関数を仕込むことも出来るって事です。
■ INDEX関数について
Excelの関数には、Index関数と言う範囲内で指定した行列の参照を取得する関数があります。この関数を使用して、印刷範囲の最終行を取得する事ができます。

実際に、使ってみました。

第一引数の範囲は、印刷したい最後の列であるH列全体にします。
第二引数の行番号なのですが、こちらは事前に作っておいた終了行があるので、そちら(セルK3)から持ってきます。
第三引数の列番号は省略します。というか、1列しか無いので指定する意味がありません。
■ 印刷範囲を指定
ここまでの情報を踏まえて、名前の管理に戻ります。
印刷範囲が設定されている「Print_Area」の参照範囲に上手く範囲を設定してやります。

開始セルはA1のままで良いですね。そして、終了セルをIndex関数で指定します。
印刷プレビューで見ると、確かに印刷したい範囲のみが表示されています。

■ 改ページ
これは補足なのですが、実際には改ページを設定しないとダメですよね。

実際には、改ページプレビューなどでページ内の印刷範囲を調整した上で、最後に印刷範囲の設定(今回の記事の内容)をしたほうが良いと思います。
計算式でガリガリやる都合上、レイアウト調整とかで行列が増減したら始めからやり直しですからね。
■ 後書き
お客様の都合で、基幹システムから出力される請求書が使えない事が良くあります。
基幹システムには、請求データ(csv)をダウンロードする機能があるので、お役様が望む書式をExcelで作って、ダウンロードしたデータを貼付けるだけで請求書が作成出来るようにしようと思ったのです。
いつもはVBA(マクロ)でガリガリ作るのですが、そうするとメンテナンスが難しくなります。そこでVBA無しでどこまでできるか挑戦して見たのですが、意外と何とかなるようです。
今回のサンプルでは手動で最終ページを入力していますが、この辺りも自動化出来ると思います。
例えば、明細行の横(印刷範囲外)にページ番号を入れておきます。さらに横にif関数とcounta関数を仕込んで明細に入力があればページ番号、無ければ0を表示させます。その列に対して、Max関数を使えば最終ページが引っ張れます。
投稿記事の一覧:http://harikofu.web.fc2.com/
--- blog end —
スポンサードリンク


