- ベストアンサー
行を追加した時の値の合計範囲に関する問題
- 行を追加する際に、合計行の参照範囲が変動しない問題が発生しています。
- 現在使用している式や関数では上手く動作せず、SUMやOFFSETなども試しましたが解決できません。
- 合計行の上に空白行を挿入し、その上の行にSUM関数を使用することで一部解決できますが、見た目や扱いに不便があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
(1)について =IF(COUNT($C$17:INDEX(C:C,ROW()-1))=0,"",SUM($C$17:INDEX(C:C,ROW()-1))) (2)について =IF(COUNT(INDIRECT("R17C:R[-1]C",FALSE))=0,"",SUM(INDIRECT("R17C:R[-1]C",FALSE))) などのようにしてみます。 同様の工夫はOFFSET関数を使っても,勿論出来ます。
その他の回答 (2)
- silverfd
- ベストアンサー率57% (204/356)
これが一番簡単ですね。 (1)=SUM(INDIRECT("C2:C"&ROW()-1)) (2)=SUM(INDIRECT("D2:D"&ROW()-1)) Indirect関数とは、文字列を数式的な意味にしてくれる関数です。 ちなみに、余計なお世話ですが、マクロについて述べさせて頂きます。 >VBAでWorksheet_ChangeやWorksheet_Selectionhangeなどは既に使用しているマクロで自動で合計値を入力することはできないと思います。 分岐を使えば(例えば集計行に範囲名をつけて最初に取得、処理後に行位置が変動していれば合計処理に分岐とか)、イベントプロシージャでも可能ですし、 >ボタンで動かすマクロでなら出来そうですが、合計を逐一表示するのにマクロボタンを設置するのもどうかと思うので・・。 行挿入マクロの後処理で合計計算処理を追加すれば、ボタンなどこのためには必要ないです。 一応、マクロの可能性について感じていただきたかったので、あえて追加しましたが、このケースでは上記Indirect関数を利用した数式で充分なのは変わりません。
お礼
keithinさんと同じ作りの関数を頂けたのですが、空白の時の場合の処理を入れたまま関数を考えて下さったkeithinさんの方をベストアンサーとさせて頂きました。 マクロの件ですが、今回Worksheet_Changeは入力後セルから指定セルへの移動に使い、 Worksheet_Selectionhangeは範囲によってエンターで進む方向を設定するために使いました。 ここにどういう風に合計処理を組み込むのかはもっと勉強しないと出来そうにありません・・orz ただそういうことも出来るのだと教えて頂けたのは大きな収穫です。 為になるご回答をありがとうございました! 今後も関数やマクロは利用していかないといけないので、今回のご回答を参考に考えていきたいと思います。
- kybo
- ベストアンサー率53% (349/647)
行を追加するときにマクロを使っているのであれば、 その行を追加のマクロの下の方にでも、数式自体を変更するようにしておけばいいのでは。 例えば合計行が25行目だとして、 gokei_gyo = 25 Range("C" & gokei_gyo).Formula = "=IF(COUNT($C$17:$C" & gokei_gyo - 1 & ")=0,"""",SUM($C$17:$C" & gokei_gyo - 1 & "))" Range("D" & gokei_gyo).Formula = "=IF(COUNT($D$17:$C" & gokei_gyo - 1 & ")=0,"""",SUM($D$17:$C" & gokei_gyo - 1 & "))" とすれば、数式もかわります。
お礼
なるほど!゜д゜ 確かに、行追加のマクロの最後に組み込めばいいだけですね・・ その発想は思いつきませんでした。盲点でした・・・。 ただ、くださったマクロコードを行追加マクロの後半に入れてみたのですが、上手く動作させることができませんでした。 gokei_gyoというのがよくわからないのですが、 「合計」のある行、例えばここでは25行目を一括で範囲指定し、「gokei_gyo」と名前をつければよかったのでしょうか。 VBAはやはり独学ではキツイですねw; ご回答ありがとうございました!
お礼
そのままコピペで動作致しました! 例では合計は25行目にしたんですが、実際には40行目くらいにいたもので ご回答頂いた関数やコードを自分で行の数値などを変えて当てはめなければいけないなと思っていたので、そのまま使えたことに感激しました。 (1)と(2)で関数の使い方が違いますが、これはどちらでも使えるということですよね。 ROWやR17Cというセルの参照の仕方など、自分にはまだ理解できていないところなのですが、どちらかの関数式をCとDの両方に使いたいと思います。 (1)についてくださった式はDにオートフィルすると崩れるようなので、Dに合わせたセルの参照をし直さないといけないようですが (2)についてくださった式はCにオートフィルしてもそのまま使えました。 今回は直すのに簡単そうな(1)の関数式を使わせて頂きたいと思います。 ご回答ありがとうございました!