• ベストアンサー

昨日の続き:行挿入時の合計範囲について

昨日の質問の件ですが、合計行が明細の最後ではなく、明細の先頭にある場合は難しいですよね。いろいろ試行錯誤してみたのですが、いい方法が見つかりません。 (知識不足もありますが) 何か方法があれば、ご教授ください。 よろしくお願いします。

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

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

↓でわかりますか? B C 2 A合計行 4 [C2]=SUM(OFFSET(C2,1,0):OFFSET(C7,-1,0)) 3 A明細 1 4 A明細 1 5 A明細 1 6 A明細 1 7 B合計行 40 [C7]=SUM(OFFSET(C7,1,0):OFFSET(C12,-1,0)) 8 B明細 10 9 B明細 10 10 B明細 10 11 B明細 10 12 datend ----

satoshi5050
質問者

お礼

分かりました。 試してみましたが、うまくいきました。 本当にありがとうございました。

その他の回答 (9)

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.10

>昨日の続き?  この事情はわかりませんが  合計行が1行だけなら明細行の外であればどこにあってもよいです。  私は、見出し行の次に合計行、以下を明細行としています

satoshi5050
質問者

お礼

ご指摘ありがとうございます。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.9

別解 B1セル(A合計)に次の数式を設定します。 =SUM(OFFSET(A1,1,1,COUNTIF(OFFSET(A1,1,0,COUNTA(A:A)),LEFT(A1,1)&"*"))) B1をB5セル(B合計)へコピーすれば自動的にA合計とB合計が算出されます。 但し、A列の?明細nは中間にブランクがあると正しい値になりません。

satoshi5050
質問者

お礼

いろんなやり方を教えて頂き、ありがとうございました。

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.8

回答No.5への補足にある模擬データでしたらB1セルへ次の数式を入力してください。 =SUMIF(A2:A5,LEFT(A1,1)&"*",B2:B5) B5セルの数式はA明細とB明細の行数が同じなのでB1セルをコピー&ペーストでB5セルへ複写すれば数式の行番号が自動的に参照範囲に変化します。 B1=SUMIF(A2:A5,LEFT(A1,1)&"*",B2:B5)       ↓ コピー&ペースト B5=SUMIF(A6:A9,LEFT(A5,1)&"*",B6:B9)

satoshi5050
質問者

お礼

このやり方も出来ました。 本当にありがとうございました。

  • msMike
  • ベストアンサー率20% (364/1804)
回答No.6

[No2補足]へのコメント、 内容が支離滅裂でサッパリポンです~ゥ

  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.5

>合計行が明細の最後ではなく、明細の先頭にある場合は難しいですよね。 明細は最後の行に順次追記するだけですか? それとも、最後の行の下へセルの挿入して追記するのでしょうか? >データは、A合計行+A明細+B合計行+B明細・・・の繰り返しの為 何を言っているのか読み取れません。 模擬データを提示してください。

satoshi5050
質問者

補足

すみません。具体的に書いた方がいいですよね。  1 A合計  100 ← (1)1行目~4行目の間であれば、Aの明細を  2 A明細1  20   挿入した時に1行目のA合計行の関数範囲が  3 A明細2  30   変わる  4 A明細3  50 ← (2)4行目・5行目の間に、A明細を挿入した  5 B合計  170   時は、1行目のA合計行の関数範囲が変わら  6 B明細1  50   ない。  7 B明細2  50  8 B明細3  70 (2)の時にも、関数の範囲が変わって1行目の合計が正常に計算されるようにしたいとということです。 よろしくお願いします。

  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.4

VBAを使った「カスタム関数」でよければ 次のようなコードで期待の動作を実現できます。 =spTotal(E2,E:E) 第一引数は合計するセル群の最上位セルです。 第二引数は合計を求めるセル群を含む列を指定します。 動作は 第一引数のセルから開始して 下方向に、空欄のセル、または計算式の埋まったセルの直前までの セルたちの合計を求めます。 なお、第二引数は計算には無関係です。 合計対象範囲が変化したときに再計算させるために与えています。 Option Explicit Function spTotal(rng As Range, DmyRange As Range) As Double  Dim RowCnt As Long  Dim wkTotal As Double    RowCnt = 0  wkTotal = 0  Do   If rng.Offset(RowCnt, 0).Value = "" Then Exit Do   If rng.Offset(RowCnt, 0).HasFormula = True Then Exit Do   wkTotal = wkTotal + rng.Offset(RowCnt, 0).Value   RowCnt = RowCnt + 1  Loop  spTotal = wkTotal End Function

satoshi5050
質問者

お礼

細かく記述して頂き、ありがとうございます。 後で、試させて頂きます。

回答No.3

>合計行が明細の最後ではなく、明細の先頭にある場合 ということは、私の回答は試されてないのですね。 応用すれば、 =SUM(OFFSET(C1,1,0):C10) でOKなことはすぐわかると思います。

satoshi5050
質問者

補足

説明不足で申し訳ありません。 データは、A合計行+A明細+B合計行+B明細・・・の繰り返しの為 一括で集計することができません。A、B・・・それぞれ集計する必要があります。  ↓ B合計行の直前にAの明細を追加した時に 「=SUM(OFFSET(C1,1,0):C10)」の「C10」が自動的に「C11」に変わってほしいのですが。 B合計行の直前ではなく、Aの明細の途中に追加した時はC11に変わります。 何度もすみません。

  • msMike
  • ベストアンサー率20% (364/1804)
回答No.2

C1: =SUM(C2:C1000)

satoshi5050
質問者

お礼

ご回答ありがとうございます。

satoshi5050
質問者

補足

説明不足で申し訳ありません。 データは、A合計行+A明細+B合計行+B明細・・・の繰り返しの為 一括で集計することができません。A、B・・・それぞれ集計する必要があります。

  • meitoku
  • ベストアンサー率22% (2258/10048)
回答No.1

C1にSUM(C1:C10)をコピーして SUM(C2:C11)と書き換えれば良いだけです。 C11)の後ろにカソールをあてれば計算範囲が現れます。 SUM()の数値は削除・書き換えができます。