エクセルで複数sumifの検索範囲の連動

このQ&Aのポイント
  • エクセルで複数sumifの検索範囲の連動について相談です。画像のように太線で区切りごとの合計金額を算出したいですが、1セルで合計したいためにSUMIFが四回使われるのが面倒です。
  • D列のセルにはSUMIFで品名ごとの数量の合計を算出し、その品の単価をかけていく方法を考えています。しかし、検索範囲が異なるため、一つのセル中の全てのSUMIFの検索範囲を統一する方法が知りたいです。
  • 他の関数や異なる方法での連動計算も検討しています。どなたか便利な方法やアイデアをご教授いただけませんか?
回答を見る
  • ベストアンサー

エクセルで複数sumifの検索範囲の連動

画像のように太線での区切りごとの合計金額を算出したいと思います。 一旦品名ごとに お菓子Aは100円 お菓子Bは20円 ガムは… と小計を算出してから、ワンクッションおいてそれらを合計してもいいのですが、 紙面のスペースの関係上1セルで合計したいと思います。そこでD列のセルには =SUMIF(A2:A5,$A$16,B2:B5)*$B$16+SUMIF(A2:A5,$A$17,B2:B5)*$B$17+   以下略 =お菓子Aの数量*お菓子Aの単価+お菓子Bの数量*お菓子Bの単価   以下略 とSUMIFで品名ごとに数量を合計してから*その品の単価を足していきたいと思います。 そうするとこの場合一つのセルにSUMIFが四回使われ、検索範囲の設定が面倒です。 1セル中の全てのSUMIFの検索範囲を統一する便利な方法はないでしょうか。 或いは別の関数を使ったまったく異なる方法でも構いません。 どなたかご教授いただければ。

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

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

=SUMPRODUCT(SUMIF(A2:A5,A16:A19,B2:B5),B16:B19) といった具合で出来ます。

BlackYoshi
質問者

補足

早速のご回答ありがとうございます。 これは便利ですね。試してみると、まさに希望していた通りのものでした。 エクセルのデータはうまく完成したのですが、自分はご教授いただいた =SUMPRODUCT(SUMIF(A2:A5,A16:A19,B2:B5),B16:B19) の表面しか理解できていないので、重ねて質問します。 差し支えなければご回答お願いします。 SUMIFの検索条件の部分には、セル番地、文字列、比較演算子を入力できるのは存じていたのですが、 ここではA16:A19と、単一の番地ではなく範囲を指定していますよね。 そうすると、その範囲に含まれる項目それぞれについて検索し、個別に合計範囲B2:B5の値を加算する という理解で正しいでしょうか。 そしてその個別の加算結果にSUMPRODUCTでそれぞれの単価を掛け算しているということでしょうか。 最後にもう一点、自分が掲載した画像の470円の塊の部分では 「アメ」の数量が0、なのではなく、そもそもアメの項目がありませんが、 この場合SUMIFの検索結果では数量0の時と同様に処理されている →SUMPRODUCTでアメの単価を掛け算しても0*単価=0 ということでよいのでしょうか。

その他の回答 (5)

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

>vlookupを使用している行にて「型が一致しません。」のエラーが発生してしまいます。 既に回答済みですが 再掲: >言い換えると「金額一覧にない品目が載っている」と、おかしなことになります。 つまり「データが間違ってる」のが直接の原因なので,あなたのエクセルのデータをしっかり確認して下さい。 マクロ以前に,最初に回答した関数による方式でも,「見た目意図した計算結果と違う」ことは確認できるはずです。 >どこかで選択範囲を変更しているのでしょうか。 んーと??こちらもマクロの中に回答が既にありますが, selection.offset(1).select としてありますが? エラーが起こったので,そこで見るのを止めたんでしょうか。

BlackYoshi
質問者

お礼

ご返答ありがとうございます。 品目をアメだけ、あるいはガムだけにしてもまだ金額一覧にない品目が載っているというのか、 と思っていたら、おっしゃる通りデータをよく確認すると 質問時の画像の「以下略」のセルが結合されたままであるのが原因でした。 横方向の結合があると、ループ後に選択範囲が広がり、全データが消去されていました。 しかし、その点を修正しても無限ループでエクセルフリーズ…。 とりあえず↓の自分で組んだVBAがありますし、これ以上お手を煩わせる訳にはいきませんので、 自分なりに研究していくことにします。 自分はネストの概念やマクロ・VBAの存在を知りませんでしたが、あなたのおかげで世界が広がりました。 とても感謝しています。

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

>その範囲に含まれる項目それぞれについて検索し、個別に合計範囲B2:B5の値を加算する アメの個数を合算する×アメの単価を掛ける=アメの合計金額が求まる を、品目ごとにそれぞれ求めて全体を合計する というだけです。アメが無ければアメの個数合計はゼロ個ですから、金額もゼロ円です。 合算の対象はご質問の画像の上半分の品目一覧じゃなく、「品目金額表に記載のある品目」が基準になっている事に留意してください。 マクロが使いたいのなら  金額表がA18:B21にあるとして  D2から結合セルが開始しているとして sub macro1()  dim h as range  range("D2").select ’A列にデータがある範囲で  do until cells(activecell.row, "A") = ""  selection.clearcontents ’D列の結合セルごとに   for each h in selection  ’上から順に個数×金額を合算していく   activecell = activecell + cells(h.row, "B") * application.vlookup(cells(h.row, "A"), range("A18:B21"),2,false)   next   selection.offset(1).select  loop end sub とかでも十分です。 こちらのやり方は前述と逆に、ご質問画像上半分の表の品目一覧が集計基準になっているのが違ってる事に留意してください。 言い換えると「金額一覧にない品目が載っている」と、おかしなことになります。

BlackYoshi
質問者

補足

何度もお答え頂きありがとうございます。 上記のマクロを実行してみたところ、 vlookupを使用している行にて「型が一致しません。」のエラーが発生してしまいます。 また、 ’D列の結合セルごとに   for each h in selection の箇所についてですが、ここでのselectionの対象は、初めに選択しているD2ということでしょうか。 for eachの処理の対象なので複数セルの範囲かと思いましたが、 そうするとD2を選択後、for eachまでのどこかで選択範囲を変更しているのでしょうか。 自分の勉強不足故にすんなりと理解できず、ご迷惑をおかけしますが、 選択範囲とエラーについてご教授いただけると嬉しく思います。 一往、vlookup等を利用することで複雑な処理せずとも為し得ますよ という肝は理解したつもりです。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

こんばんは! VBAでの一例です。 D列の結合セル行数がバラバラでも対応できるようにしてみました。 前提条件として (1)↓の画像のようにSheet1のD列は必ず結合されていて、結合されている行が一つのまとまりとする。 (2)Sheet2のA・B列に単価表を作成しておく。 (3)両Sheetともデータは2行目からある。 (4)SUMIFS関数を使用していますので、Excel2007以降のバージョンである。 以上の条件で・・・ Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面に ↓のコードをコピー&ペースト → Excel画面に戻りマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub Sample1() 'この行から Dim i As Long, k As Long, endRow As Long, wS As Worksheet Set wS = Worksheets("Sheet2") Application.ScreenUpdating = False With Worksheets("Sheet1") endRow = .Cells(Rows.Count, "A").End(xlUp).Row For i = 2 To endRow With .Cells(i, "D") .Value = .Row End With Next i .Range("A:A").Insert For i = 2 To endRow If .Cells(i, "E") <> "" Then .Cells(i, "A") = .Cells(i, "E") Else .Cells(i, "A") = .Cells(i - 1, "A") End If Next i .Range("A:A").AdvancedFilter Action:=xlFilterInPlace, unique:=True .Range("A:A").Copy wS.Range("D1") .ShowAllData Range(.Cells(2, "E"), .Cells(endRow, "E")).ClearContents For i = 2 To wS.Cells(Rows.Count, "D").End(xlUp).Row For k = 2 To wS.Cells(Rows.Count, "A").End(xlUp).Row wS.Cells(i, "E") = wS.Cells(i, "E") + WorksheetFunction.SumIfs(.Range("C:C"), _ .Range("A:A"), wS.Cells(i, "D"), .Range("B:B"), wS.Cells(k, "A")) * wS.Cells(k, "B") Next k Next i For i = 2 To wS.Cells(Rows.Count, "D").End(xlUp).Row .Cells(wS.Cells(i, "D"), "E") = wS.Cells(i, "E") Next i .Range("A:A").Delete wS.Range("D:E").Clear End With Application.ScreenUpdating = True End Sub 'この行まで こんな感じではどうでしょうか?m(_ _)m

BlackYoshi
質問者

補足

返事が遅れてすみません。 頂いた回答を理解するために、マクロとVBAを一から学んできました。 が、五日間のにわか勉強では、中ほどの「.ShowAllData」辺りから何が起こっているのかよく理解できませんでした。 個別のオブジェクト(?)やステートメント(?)単位ではまだ何とか理解できたのですが、 全体の流れをつかめないと言ったところです。 お忙しい中お手数おかけしてまでせっかく提供して頂いたものを使用しないのも申し訳ないのですが、 理解できない中で予期せぬ事態が発生しても対応できないため、また後学のために 頂いた記述と、他の回答者さんからのアドバイスも参考に、 自分で理解できる程度の自分なりのVBAを記述してみました。 大変勉強になり、なにより自分に勉強するきっかけをくださったことに感謝します。 VBAを組み立てる中で疑問が生じましたので、差し支えなければ一点ご教授いただければと思います。 前提条件として (1)D列は必ず結合されていない。 (2)合計金額を算出するまとまりごとに罫線を引いてある。 (3)両Sheetともデータは2行目からある。 (4)単価表は、質問時の画像の位置から F1:G5 へ移動してある。 (5)SUMIFS関数を使用しているので、Excel2007以降のバージョンである。 Sub formula使用() Dim endrow As Long, i As Long, a As Long Application.ScreenUpdating = False endrow = Cells(Rows.Count, "B").End(xlUp).Row i = 2 a = 1 Do While i <= endrow If Cells(i, "D").Borders(xlEdgeBottom).LineStyle = xlContinuous Then Cells(i, "D").Formula = "=SumProduct(SumIf(A" & a + 1 & ":A" & i & ",F2:F5,B" & a + 1 & ":B" & i & "),G2:G5)" a = i End If i = 1 + i Loop End Sub 実行してみるとうまくいきました。 上記のものではFormulaを使っていますので、セルには関数が記入されます。 元は Cells(i, "D") = _ WorksheetFunction.SumProduct(WorksheetFunction.SumIf(Range("A" & a + 1 & ":A" & i), _ Range("F2:F5"), Range("B" & a + 1 & ":B" & i)), Range("G2:G5")) のように関数自体ではなく、関数で得た値をセルに入力しようとしていました。 ですがどうも 「型が一致しません」 というエラーに見舞われてしまいます。 関数の中に関数を組み込むのがうまくいっていないのでしょうか。 宜しければお願いします。

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

回答No.1についても内側のSUMIF関数で範囲(A2:A5、B2:B5)を他の集計範囲(A6:A9)へコピーすると誤りが生じますので各集計範囲で照合範囲と集計範囲を定義し直す必要があります。 また、単価を抽出する範囲(A16:A19、B16:B19)は絶対アドレス($A$16:$A$19、$B$16:$B19)を使用しないと他の集計範囲に式をコピーできません。 単純にコピーすると失敗しますので注意してください。 これらのことを考慮すれば回答No.1が最も有効な手段と評価できます。

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

>1セル中の全てのSUMIFの検索範囲を統一する便利な方法はないでしょうか。 集計範囲が異なるのでコピーすると正しい結果を得られません。 最大の行数に合わせて空欄の行を増やせば1つの式を他の集計範囲へコピーできます。 貼付画像は提示された集計範囲の大きい方に合わせて作成しました。 SUMIF関数を加算する手段はSUM関数で対応すれば式のデバックが容易になります。 =SUM(SUMIF(A2:A6,$A$16,B2:B5)*$B$16,SUMIF(A2:A6,$A$17,B2:B5)*$B$17,SUMIF(A2:A6,$A$18,B2:B5)*$B$18,SUMIF(A2:A6,$A$19,B2:B5)*$B$19)

BlackYoshi
質問者

お礼

関数内にさらに関数(この場合ではSUM内にSUMIF)を配置するのは、初心の自分にとっては新鮮でした。 今まではこのような使い方はできていなかったので、とても勉強になりました。 ありがとうございます。 空欄を設ける点については、質問では省略して述べていませんでしたが、 実は品名の項目が1行のみの箇所から、10行程度の箇所まで様々です。 ですので、全てを10に合わせると少々上下方向に長くなってしまいますが、大変参考になりました。

関連するQ&A

  • EXCEL SUMIFについて

    EXCELでSUMIF関数を使って金額が集計される様になってるのですが 何故かBATTERYとTHERMISTORという品名だけが集計されません↓ 何故でしょうか?他の品名に書き換えると集計されるます。 ちなみに関数は=SUMIF(A1:A351,"BATTERY",G1:G351)と (範囲,検索条件,合計範囲)のセオリー通りでやってるのですが…

  • SUMIF関数の検索条件が複数の場合の式は?

    はじめまして。 SUMIF関数を用いているのですが、検索条件にAまたはBまたはCに合致する合計を出したいのですが、以下の式の場合、検索条件には何を入れたらいいのでしょうか? SUMIF(範囲,"A"または"B"または"C",合計範囲)の、,"A"または"B"または"C"のところです。A,B,Cは文字です。 "A"*"B"*"C"では無いですよね? 宜しくお願い申し上げます。

  • SUMIF関数【複数のシートの検索範囲にするには】

    初めて質問します。 エクセルのSUMIF関数で、範囲と合計範囲を、複数のシートにまたがってを選択したいのですが、上手くいきません。 それぞれのシートの作り(行・列の数、表示形式など)は同じです。また選択する範囲も同じです。 目的は特定のクライアントの期間別の合計売上を算出することです。 シートごとに月単位の売上が記録してあり、検索条件にクライアント名を入力すれば、さかのぼった一定期間の売上が算出できるようにしたいのです。 SUMIF関数入力に従っていくと、【範囲】shiftを押しながらシートを選び、シート状の範囲を選択、【検索条件】、【合計範囲】shiftを押しながらシートを選び、シート状の範囲を選択、となります。 具体的な数式としては、 =SUMIF('3月売上:1月売上'!B2:B100,'0805'!$H$20,'3月売上:1月売上'!E2:E100) となりますが、エラーになってしまいます。いろいろ試したのですが、上手くいきません。どなたかお力添えをお願いしまう。 ※今回は連続する数ヶ月の範囲でしたので、シートを:でつないだもので問題ないのですが、もし任意の複数シートを選ぶ場合についても、教えていただければ幸いです。ctrlではダメでした。

  • Excelの関数「sumif」の使い方について

    条件に一致したセルの合計をするのに「sumif」というのが あります。 たとえば、ヘルプにのっていた例文を見ると 「=SUMIF(A2:A5,">160000",B2:B5)」 と書いてあります。これは、A2~A5のセルで16000より大きい 場合はそれぞれB2~B5のセルを合計することになりますが、 このときの条件「16000より大きい」というのをどこかのセル の値より大きい、たとえばA1のセルの値より大きい「">A1"」 とかにしようとしてもできません。 だめなのでしょうか?

  • エクセル:Sumif中の式

    添付のようにSumif中の”合計範囲"をセルに名前を付け関数を使ってやろうとしています。 Sumif中の式の書き方を教えて下さい。 リンゴと言う名前の部分にある2016の個数を合計する時、合計範囲の書き方はどうしますか。 下はセルの範囲の名前”年2016”を作るために”年”&C1(年が表示されているセル)としましたが、全然ダメです。 =sumif(りんご,B2,"年"& C1) よろしくお願いします。

  • sumif関数の検索値における、他セル参照の方法

    sumif関数について質問です。 =SUMIF(範囲,検索値,合計範囲)の検索値に明日以降の日付を入れたいと思い、 本日の日付が入っている他セル(例A10)を参照して、=SUMIF(範囲,">A10",合計範囲)としたところダメで、 他セルを参照せず、=SUMIF(範囲,">6/12",合計範囲)のように、日付を手入力するとうまく反映されるようです。 これ参照する方法で何か解決策ないでしょうか?

  • EXCELのSUMIFについて

    =SUMIF(A1:A10,">5",B1:B10) これで、1から10の範囲でA行に"5"より大きい数字が入ってるB1からB10の値の合計がでますよね? "5~10"という範囲を与えるには、" "の中はどういう風に入力したらいいのですか?

  • エクセルsumifで検索条件に月を指定

    購入した豆の帳簿をエクセルでつけている者です。 下の表で、sumifなどの関数を使って 購入した豆数量の月ごとの合計を出すことはできるのでしょうか? (1月は合計○個、2月は合計△個購入・・・という具合に) ----------- 別の質問http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1317382203で、 =SUMIF(A2:A5,">=2008/4/1",B2:B5)-SUMIF(A2:A5,">2008/4/30",B2:B5) のように検索条件に「年/月/日」を使う方法が紹介されていたのですが、 この表は次年度も使いまわしたいと考えているので、 検索条件に年の指定はしたくないのです。 sumifでは不可能なのかなと思い、 似たような質問http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1437742649 を参考にして、月のみを検索条件にする下の式を作ってみたのですが、 #VALUE!エラーが出てしまいました。 =SUMPRODUCT((MONTH(テーブル1[日付])=1)*テーブル1[豆数量]) --------- なにかうまい手はないでしょうか。ご指南ください。

  • ExcelのSUMIF関数についてです。

    ExcelのSUMIF関数についてです。 下記のような表を使用して、 商品コードが一致する商品数の合計をD2セルに入力したい。 (※A2,A3,A4...とA列の中でコードが一致したら、その数量の合計を出す)       A        B       C    D 1     商品コード  商品名   数量   計 2     PD0001    AAA     50 3     PD0019    BBB     20 4     PD0009    CCC     150 5     PD0001    AAA     1 6     PD1004    DDD     15 7     PD1027    EEE     50 8     PD0009    CCC     40 9     PD0019    BBB     30 :      :         :       : :      :         :       : sumif関数を使用して、 D2に =SUMIF(A:A,A2,C:C) を入力コピーすると     D     計 2   35 3    1 4   50 5   45 6    0 7    0 8    0 9    0  :    : :    : となってしまいます。     D     計 2   51 3   50 4   190 5   51 6   15 7   50 8   190 9   50  :    : :    : という出力にするにはどうしたらいいでしょうか? ちなみに、コードではなく商品名で D2に =SUMIF(B:B,B2,C:C) を入力コピーするとうまくいきます。 初歩的なことなのかもしれませんが、 商品コード数も数量もかなり膨大なものを計算するので困っています。 宜しくお願いします。

  • ExcelのSUMIF関数で検索条件が複数あるとき

    A="あ" もしくは、A="い" のときのBとCの合計を求めたいと思ってます。 SUMIF関数で計算できるのは分かったのですが、計算式が長くゴチャゴチャ しているので、もっとスマートに計算できる方法があれば、教えてください。 =SUMIF(A1:A5,"=あ",B1:B5)+SUMIF(A1:A5,"=あ",C1:C5)+SUMIF(A1:A5,"=い",B1:B5)+SUMIF(A1:A5,"=い",C1:C5)   A  B  C 1 あ 500 80 2 い 300 50 3 え 800 40 4 い 200 80 5 う 100 60

専門家に質問してみよう