たとえばA列が30行ある帳票なんですが、セル(A30)にはA1~A29の合計を表示し、2ページ目のセル(A60)にはA1~A59の合計を表示したいです。このときセルA(60)の数式は「=SUM(A1:A29,A31:A59)」となります。2ページまでなら良いのですが1000ページくらいになると「=SUM(A1:A29........)と数式が長くなってエクセルの数式の限界(ネットで調べると長さが1024までとありました)まで行ってしまいます。
そこで数式を=SUM(A1:A5999)のように生成するようにしても、途中のページごとの小計が合計に合算されてうまくいきませんし、小計部分のセルをあとから引こうと考えると今度また数式が長くなってしまいます。何か良い方法はあるでしょうか。
ExcelVBAの中で値の合計を計算をして直接セルに設定する方法は思いつくのですが、他の事情との兼ね合いでやりたくありません。セルに設定する数式を短くする手段で(実現できれば)お願いします。たとえばオフセット(?)のような記述が数式でできないのかなあと
SUBTOTAL関数を使ってはどうでしょうか?
A30のセルに「=SUBTOTAL(9,$A$1:A29)」と書きます。
A60のセルの場合は「=SUBTOTAL(9,$A$1:A59)」です。
(A30のセルからコピーペーストで数式が希望通りに反映されるかと思います。)
ExcelVBAで解決したいというご質問でしょうか、それともExcel関数に関するご質問でしょうか。
小計行を60行おきに設定するということでしたら、For~Nextステートメントを二重に――外側で総合計(60の倍数行)を、内側で小計のループ(60行)を――回せばいいでしょう。
B列に小計を置くことはできませんか?
この場合、A列の60, 120, 180‥‥行は空白となり、B列の60, 120, 180‥‥行に小計が入る形になります。
A29やA59といったようにページ毎に書き換える必用がなくなりますので、ご利用あれ。
単純に、
(A30)=SUM(A1:A29)
(A60)=SUM(A31:A59)+A30
(A90)=SUM(A61:A89)+A60
...(以下A60のコピーペースト)
で実現できるんでは。subtotalの方がエクセル関数の活用という点で断然エレガントですが。
コメントにて
ありがとうございます。そのまま使ってみようと思います。
>gkkjさん
pahooさんの回答を読んでその発想に至りました。
今回はsubtotal関数を使ってみようと思います。