ExcelのSUM関数の集計範囲を可変にしたい

このQ&Aのポイント
  • ExcelのSUM関数を使ってカテゴリ別の売上や利益を集計しているリスト表で、行を追加する際に集計範囲が自動的に変わるようにしたい。
  • マクロを使用して行を追加する場合、集計範囲が途中になる行に行を挿入すると集計対象範囲がずれる問題がある。
  • 実装方法としては、表全体の最後の行や小計の行番号を使用して集計範囲を変更する方法や、マクロで行を追加する際に対応する方法が考えられる。
回答を見る
  • ベストアンサー

ExcelのSUM関数の集計範囲を可変にしたい

ExcelのSUM関数の集計範囲を可変にしたい 1.状況、問題点 商品毎の売上、利益を管理するリスト表が あり、その表の行に対する追加、更新処理を VBAマクロで行っています。 使用環境はExcel2010 リスト表は、帳票としての見易さを考慮して、 同じカテゴリに属する複数の行に対して小計行 を設けカテゴリ別の売上、利益を集計しています カテゴリに属する行範囲に対してSUM関数を使っ ているということです (例1)この表にマクロで行を追加させる際、 あるカテゴリの小計欄で参照している集計 範囲の行の途中に行を挿入する場合は、行 を追加してもSUM関数の集計範囲は自動的に 拡大されます。   A  B    C   1 項目   売上    2  田中   100 3 小計   100   4 山田 200 ⇒ 挿入   5  佐藤 300   6  小計   600 式 = SUM(C4:C5) 3行目と4行面の間に行を挿入するとき  SUM関数の集計範囲は自動的に拡大され る  SUM(C2:C4) ⇒ SUM(C2:C5) (例2)挿入する行が集計行の直ぐ上の場合 SUM関数の集計対象範囲がずれてしまう   A   B    C   1 項目  売上   2  田中  100 3 小計  100   4 山田 200   5  佐藤 300 ⇒ 挿入    6  小計 600 ※      ※ 式 SUM(C4:C5) は   自動的にはSUMC(C4:C6)とはならない 2.実現したいこと       小計の直前にに行を挿入した場合も自動的に   集計範囲が変わるようにしたいのです。 実装方法 案1 (1)インストラクタのネタ帳  http://www.relief.jp/itnote/archives/003417.php  に、「表全体の最後の行」※に集計行がある場合として 「合計範囲を自動的に変更する」方法の紹介あり。  この方法はCOUNTA()で入力済みのセルをカウント。   私のケースでは  ・売上、利益などのセルが空白となる場合がある  ・C列は 売上 データを記載する列で   なので半角スペースや全角スペース は入らない  ・#REFやDIV/!0などは入りうる   C4:C5 のセル数は DIV/0!なども含めデータが入っているセル数  +ブランクが入っているセル数 は  COUNTA(C4:C5) + COUNTBlank(C4:C5) なので セル C5  =SUM(C2:INDEX(C4:C5, COUNTA(C4:C5)+COUNTBlank(C4:C5))   とするか?     ※「インストラクタのネタ帳」の方法は、「表全体の行数」を  もとめる場合に最後の行までを指定できて有効ですが、上の  ように小計をもとめる場合は、どうしても小計をもとめる範囲  式に書く必要があり、そこが集計範囲が変わってしまうと役に  立たないです。  代案としては、6行目の小計の行番号から3行目の小計の行番号  を引いて行数を求める方法でしょうか    この方法の場合、小計の式に 6行目行番号-3行目行番号  のように具体的に記述してはNGなので "下"の小計行から"上"  の小計行を引く というような間接的な指定の仕方が必要と  考えています。案1の検討はここまでです。 実装方法 案2  上のように表自体の集計関数を変える以外に、  マクロで対応する方法  行を追加する際に、 a)行の追加がある場合、行の挿入位置が小計   の集計範囲の”途中”なら 何もしない、  b)追加する行が集計行のすぐ上になる場合 つまり変更前の挿入位置+1   が小計行の行番号と等しい時は、追加する行数分   SUM関数の集計範囲を広げる     案1が難しそうなので案2で実装しようと思っています  Q1 案1と案2の検討結果についてお気づきの点があれあば教えて     ください  Q2 可能であれば、案2の実装方法についてヒント程度でもいいので     教えてください  以上

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

  • ベストアンサー
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.5

>ただこの方法では、小計の所に集計されるのが先頭行から、小計の部分を除くすべての売上になってしまことがわかりました。   >先の例で2番目の小計行では 売上 500となるべきところで 600になってしまいます  はい、御質問文に有る例では   A   B    C   1 項目  売上   2  田中  100 3 小計  100   4 山田 200   5  佐藤 300 ⇒ 挿入    6  小計 600 ※ となっており、「売上 500」にはなっておりませんでしたので、 >小計の所に集計されるのが先頭行から、小計の部分を除くすべての売上 を求めるための方法をお尋ねになっているものと思った次第です。 >売上 500となるべき >最初の小計行、2番目の小計行をそれぞれの範囲でもとめる という事でしたら、次の様な関数にして下さい。 =SUM(C$1:INDEX(C:C,ROW()-1))-SUMIF($A$1:INDEX($A:$A,ROW()-1),"小計",C$1:INDEX(C:C,ROW()-1))*2

kazusmo
質問者

補足

kagakusukiさん お世話になります。最初の例がそもそも間違っており 大変申し訳ありません。 アドバイス頂いた式であれば、期待した通りの 結果になりました。 個人的にはこれで問題ないと思うのですが、 この表の管理元が別部署でこちらの都合だけ で、少々複雑なこの数式への修正を許可して くれるかるか自信が持てないです。 この式への修正を許可してもらえない場合も 考えてマクロ修正も考えておkないといけな さそうです。 この数式は、私が知らなかっただけでベテラン の方であればときどき目にするもので特に 問題ないでしょうか? お気づきの点あれば教えていただきたく。 以上

その他の回答 (4)

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.4

そのリスト範囲を、ホームタブの「テーブルとして書式設定」してください。 このように設定しておけば、通常のリストでは対応しない行の挿入時の数式の自動挿入だけでなく、データの追加をした場合も、入力規則のリスト範囲やピボットテーブルなどのデータ範囲が自動拡張してくれます。

kazusmo
質問者

補足

KackyNo1さん 返信ありがとうございます 試してみました。当方はExcel2007環境ですが テーブルとして書式設定ー新しいテーブルスタイル ウィンドウが開く ここで集計行を開いて そこで集計行の書式を定義しておけば 行挿入時の自動挿入やデータ追加時の・・・ などを設定できるという点、そんな機能があったとは知りませんでした 非常に参考になりました ただ、質問の際には思いいたらず説明していませんでしたが リスト表は、自分以外が管理しており、私の都合で書式を定義したり できません なのでこの方法は、私のケースで使えなさそうです。 参考までに教えていただきたいのですが 「テーブルとしての書式設定」機能は、新しくテーブル を1から作る場合は有用だと思いますが、私のように 誰かがすでに作ってしまったテーブルを前提にして書式を定義 するというようなことが可能でしょうか。 たとえば 集計行も小計 が複数あって それをまとめて総合計 があるよういうような場合、Excelに小計、総合計などを定義 できるものなのでしょうか?

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

エクセルの機能の「小計」を使い、集計行を都度入れ直してやるのも一つの方策です。 ご質問の直接の回答としては、B6には =SUM(B$1:INDEX(B:B,ROW()-1))-SUMIF(A$1:INDEX(A:A,ROW()-1),"小計",B$1)*2 といった数式でも計算できます。

kazusmo
質問者

補足

keithinさん 返信ありがとうございます。 この方法でも kagakusukiさんと同じで 2番目の売上小計 は 500となるべきところが、600となってしまいます 何か良い方法についてお気づきなら教えてください 

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 A列に「小計」と入力されている行の所に入力する関数を次の様なものにされると良いと思います。 =SUMIF($A$1:INDEX($A:$A,ROW()-1),"<>小計",C$1:INDEX(C:C,ROW()-1))

kazusmo
質問者

補足

kagakuskiさん  返信有難うございます。試してみました。    ただこの方法では、小計の所に集計される  のが先頭行から、小計の部分を除くすべての売上  になってしまことがわかりました。    先の例で2番目の小計行では 売上 500となるべき  ところで 600になってしまいます  最初の小計行、2番目の小計行をそれぞれの範囲で  もとめるには修正が必要です。    時間がありましたら、教えて頂けると大変参考に  なります。

  • shintaro-2
  • ベストアンサー率36% (2266/6244)
回答No.1

表はそのままで 集計をピボットテーブルで行えば済むのでは?

kazusmo
質問者

補足

shintaro-2 さん すいません ピボットテーブルの機能詳しくないのですが 小計を求められればいいので大がかりすぎる気がします すでにリストがピボットテーブルで作成されていれば小計行の 追加等もレベルを上げたりするということですね お気づきの点あればお願いします

関連するQ&A

  • EXCEL行挿入・行削除しても正しく集計する方法

    例えばSUM関数で、1~10行目までが明細行で、11行目に合計行がある場合、明細の途中で1行挿入しても、自動的に集計範囲が変わってくれますが、最終明細行の下に行挿入した場合、集計範囲が変わってくれません。  (1)SUM(C1:C10) → 明細途中に1行挿入 → SUM(C1:C11)  (2)SUM(C1:C10) → 明細最後に1行挿入 → SUM(C1:C10) (2)の場合でも、全明細行集計するようにする方法(関数)があれば教えてください。(Office365使用) よろしくお願いします。

  • Excelの表で集計範囲が変わってしまう場合の範囲指定の仕方

    以下の様な表で、演目の数が毎回変わるので、行の挿入や削除 一部を複写したり、データ削除して行を増減させるのですが、 集計にSUM関数を使っているのですが、集計範囲を直し忘れたり して、結局いつも手計算で検算しています。マクロとかは、全然 使えないので、どうしたら良いかどなたか教えて下さい。   演  目     時間 はじまり       12分  ・・・ここは固定 合奏「ぞうさん」  25分 寸 劇        30分 ピアノ演奏     40分   小計    1時間47分 手 品       35分 きり絵       25分   小計    1時間   合計    2時間47分

  • エクセルSUM関数の範囲を任意に変える

    セルB1に=SUM(A1:A10)と、とりあえず入力しました この関数の範囲をセルC1の数字で帰れるようにしたいです C1に10と入力すれば=SUM(A1:A10) C1に20と入力すれば=SUM(A1:A20) となるように出来ますか?

  • エクセルの集計について教えて下さい。

    エクセルの集計について教えて下さい。 例えば下記の左の表で1月のそれぞれの記号の数が知りたい場合、 どのような方法が1番簡単に集計出来るでしょうか。 左の表を参考に右の表を埋めたいのですが あまりエクセルに詳しくないので小計か関数だとSUMくらいしか使えません。 何かいい方法があれば教えてください。

  • マクロを使用した表において集計を自動表示する

    エクセルのマクロでABC集計表なるものを作成しています。ボタンを押す毎に下位に行が追加され表ができる形です。行を挿入する毎に右側の3列に設けたセルにA~C品の数量を記入し、その集計を各2行目のセル(色付きのセル)に表示できるようにしたいと考えています。例えばA品の集計をK6に”=SUM(k7:k7)”として、ボタンを押して下へセルを追加しますと、集計が正しくされず、計算式を確認すると”=SUM(k8:k8)”となっており、数列1のk7が固定されていません。 マクロ文を入れないとできないのでしょうか、ご教授下さい。よろしくお願いします。

  • エクセル 変数でのSUM

    エクセルのデータをグループに分け、小計を取りたいのですが、データ件数はそのつど異なります。 マクロを使い、クリックひとつで小計を出すようにしたいのです。 データの並び替え、グループが異なると小計用の行を挿入するところまでは出来たのですが、その後SUMの書き方が判りません 行の変数がLIN_A、LIN_B の場合 Cells(LIN_C,3).VALUE=SUM(C"LIN_A":C"LIN_B")??? のように書くにはどのようにすれば良いでしょうか? 宜しくお願いいたします。

  • エクセル関数countifの初歩的な使い方(範囲)のことで教えてください

    表に書かれたデータ数を数えるときに使う関数countifで、検索範囲を自由に変更して集計できるようにしたいので、その方法を教えてください。例えば10行5列の表の各セルにa~zのどれかが入っていて、1~5列まで集計した表を作りました。次の6~10行までまで、その次には1~10行までというように、行の検索範囲を自由にしたいのです。自分で作った集計表では、すべての関す運式の範囲をいちいち変更しなければならないの面倒です。マクロを組まなくては無理ですか。

  • エクセルの関数について

    Windows Xp エクセル2003を使用しています。 業務で使用している集計表ファイルがあり、別ファイルにデータを反映させたいのです。 集計表のセルA1を検索値としセルB1とセルB2の値を返す関数はないでしょうか? 集計表のつくりは約1000行あり、セルA3を検索値としてセルB3の値を返す行もあります。 セルA5を検索値とし、B5、B6、B7、C5,C6の値を返す行など様々です。 こういったデータがランダムで表になっています。一つの検索値に対して、検索値の水平方向はvlookup関数で表示出来たのですが、 一つの検索値で2つの値を返す関数が分からず、困っています。 1行下や2行下を検索する関数も参考にしたのですが、集計表のつくりがランダムの為、検索してほしくないものまで表示されてしまうなど、ウマクできませんでした。 宜しくお願いします。

  • エクセル2003の「串刺し集計」について教えてください。

    年度別の売上等の集計表を作っています。 月毎にシート名を「0604」、「0605」・・・とし、半期毎にも集計を かけたいと思っています。(0604~0609のシート間) それぞれのシートは同じ表で、B列に「曜日(月~日)」が D列には「客数」が入っています。 そこで「特定の曜日の客数」を半期毎の集計シート(0609の後)に 表示させようとして、下記のような関数を入れました。 =sum('0604:0609'!,sumif($c$2:$c$30,"月",d2:d30)) しかし、「入力された数式は正しくない」と表示されてしまい ヘルプを参照しましたが、一般的な入力時の注意だけでした。 SUMにはSUMIFを組み合わせられないのでしょうか? 参照するセルの値が変わっても、集計結果に反映される関数を 教えていただけませんでしょうか。

  • エクセルで集計をしたいのです

    お世話になります。 Accessからエクスポートした表があります。 (集計元表) [商品名]|[支店名]|[日付]|[売上数]| 商品A|支店1|2011/08/01|6| 商品A|支店1|2011/08/05|2| 商品A|支店2|2011/08/01|3| 商品B|支店1|2011/08/01|9| 商品B|支店2|2011/08/01|1| … これを以下のように、商品毎に表にしたいのです。 (集計表:商品A) 商品A|8/1|8/2|8/3|8/4|8/5|合計| 支店1| 6 | 0 | 0 | 0 | 2 | 8 | 支店2| 3 | 0 | 0 | 0 | 0 | 3 | 合計 | 9 | 0 | 0 | 0 | 2 | 11 | (集計表:商品B) 商品A|8/1|8/2|8/3|8/4|8/5|合計| 支店1| 9 | 0 | 0 | 0 | 0 | 9 | 支店2| 1 | 0 | 0 | 0 | 0 | 1 | 合計 | 10 | 0 | 0 | 0 | 0 | 10 | 合計の行/列は最後にsumしますが、集計元表から 集計表カドの商品名、日付、支店を判別してセルに売上数を収める 手段のヒントを頂ければ幸いです。 セル関数でもVBAでもなんでも構いません。 宜しくお願いします。

専門家に質問してみよう