[[20150602155558]] 『同じ名前のグループで合計額を算出する数式・関数』(equity) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『同じ名前のグループで合計額を算出する数式・関数について』(equity)

初めて質問させていただきます。

 以下の図1をご確認ください。

 ★図1

      A       B       C        D        E        F

 1  [name] [money] [money2] [total2] [total3] [total]
 2   a        1       2        3        3        3
 3   b        1       2        3        6        6
 4   b        1       2        3        3        
 5   c        1       2        3        3        3
 ・
 ・
 ・
 10

 最終的にF列に合計額を表示するつもりで作成しました。
 D列とE列に入っている値は、F列に入っている数式で利用します。

 D2=SUM(B2,C2)
 その行の合計額を算出します。
 ※B列とC列の値の合計です。

 E2=SUMIF(A2:$A$10,A2:$A$10,D2:$D$10)
 その列から最下部まで入力されているA列の文字列で
 同じ文字列をもつ行のD列の合計を算出します。
 ※図1の場合はA列のbが2つあるので、D3とD4の値を合計して
  E3が6になります。

 F2=SUMPRODUCT(MAX(($A$2:$A$10=A2)*($E$2:$E$10)))
 最上部から最下部まで入力されているA列の文字列で
 同じ文字列をもつ行のE列の最大値を算出します。
 ※図1の場合はA列のbが2つあるので、E3とE4の最大値を算出して
  F3が6になります。

 さらに上記の関数を以下の◆に置き換えます。
 置き換えたものが図1のようになります。

 F2=if(◆=E2,◆,"")
 A列の文字列で同じ文字列をもつ場合
 同じ文字列をもつ最上部の行のみF列の値を表示させます。
 ※図1の場合はF4が空白になります。

 -------------------------------------
 ここからが本題です。
 合計値に新しいケースが出てきたため、数式の改善が必要です。

 F列にマイナス値が表示されるべきケースです。
 以下の図2のようになることを期待しています。

 ★図2

      A       B       C        D        E        F

 1  [name] [money] [money2] [total2] [total3] [total]
 2    a      -10      2        -8       -8       -8
 3    b        1      2         3       -5       -5
 4    b      -10      2        -8       -8          
 5    c        1      2         3        3        3
 ・
 ・
 ・
 10

 図2を表現するためのF列の数式をご教授ください。
 ちなみに私の構成は固執していません。
 目的を達成できる
 もっとスッキリした構成があるならば是非とも。。!

 以下は私の失敗作です。。

 F2=IF(SUMPRODUCT(MAX(($A$2:$A$10=A2)*($E$2:$E$10)))=E2,SUMPRODUCT(MAX(($A$2:$A$10=A2)*($E$2:$E$10))),IF(AND(E2<0,E2>SUMPRODUCT(MIN(($A$2:$A$10=A2)*($E$2:$E$10)))),E2,""))
 ※A列に同じ文字列が入力されている場合(図2のA列がbの場合)は
  表現できますが、A列が一意の場合(図2のA列がaの場合)は失敗する(空白になる)。

 < 使用 Excel:Excel2010、使用 OS:Windows7 >

(equity) 2015/06/02(火) 15:59


こんにちは

セルF2に

=IF($E2=MAX(IF($A$2:$A$10=$A2,$E$2:$E$10,"")),MAX(IF($A$2:$A$10=$A2,$E$2:$E$10,"")),"")

と入力して、「Ctrl」+「Shift」+「Enter」で確定して下方にフィルコピーとかでどうでしょうか?

(ウッシ) 2015/06/02(火) 16:44


ウッシさん
ありがとうございます!
実機で確認してみたところ。。
成功しました!完璧です!結婚して下さい!(笑)

今回の質問で、私のスキルの程度は把握できるかもしれませんが
配列数式はまだノータッチなのです。。

関数に依存せずに、これからも精進します。
これから回答いただいた数式を解析・学習します。
(equity) 2015/06/02(火) 16:58


ウッシさん
以下の図3のケースでは結果不良でした。。
5行目を差し込みました。

 ★図3(ウッシさんの場合)

      A       B       C        D        E        F

 1  [name] [money] [money2] [total2] [total3] [total]
 2    a      -10      2        -8       -8       -8
 3    b        1      2         3       -2           ←ココ
 4    b      -10      2        -8       -5          
 5    b        1      2         3        3        3  ←ココ   
 6    c        1      2         3        3        3
 ・
 ・
 ・
 10

 ★期待する結果

      A       B       C        D        E        F

 1  [name] [money] [money2] [total2] [total3] [total]
 2    a      -10      2        -8       -8       -8
 3    b        1      2         3       -2       -2  ←ココ
 4    b      -10      2        -8       -5          
 5    b        1      2         3        3           ←ココ
 6    c        1      2         3        3        3
 ・
 ・
 ・
 10

E列にマイナスがある場合は
0以下かつ最大値
という条件がポイントですね。
私も格闘中です。。
(equity) 2015/06/02(火) 17:12


こんにちは

表が崩れていて良く分からないのですが、

0以下かつ最大値

っていつ出た条件ですか?

(ウッシ) 2015/06/02(火) 17:18


 表の崩れは、余計なお世話とは思いましたが、直しておきました。

 (見にくくて、考えにくいので・・、・・けど仕様の解釈に確信が持てないので、思考自体停止中)

 equityさんへ 
  表の場合、各行の左端に半角スペースを入れると整形されますので、
  今後ご励行願います。

(半平太) 2015/06/02(火) 17:22


半平太さん
わざわざありがとうございます。
今後は整形に注意します。

ウッシさん
「E列にマイナスがある場合は0以下かつ最大値」はF列に目的の
値を算出するためのロジックとして記入しました。

しかし、グループ内でE列にマイナスの値を含んでいても
F列にプラスの値が算出されることを期待する場合
(図3でB5が10の場合)などは、このロジックは通用しませんでした。。

F列が、グループ内でE列の最上部の値を拾ってくれれば
話は早いんですケド。。
(equity) 2015/06/03(水) 08:01


進捗報告。自己解決しかけています。
E列をいじりました。

E2=SUMIF($A$2:$A$11,$A$2:$A$11,$D$2:$D$11)

F2=IF(E2<0,E2,IF(SUMPRODUCT(MAX(($A$2:$A$11=A2)*($E$2:$E$11)))=E2,SUMPRODUCT(MAX(($A$2:$A$11=A2)*($E$2:$E$11))),IF(AND(E2<0,E2>SUMPRODUCT(MIN(($A$2:$A$11=A2)*($E$2:$E$11)))),E2,"")))

あとはグループ内のF列の最上部以外を空白にするだけです。。
一応、上記の数式でモニタリング募集中です。
(equity) 2015/06/03(水) 08:35


でもF列が意味を成しませんね。。

F列の最上部以外を空白にするために
変更前のE列があったかもしれません(今、気付いた)。
(equity) 2015/06/03(水) 08:49


 ・A列グループのE列が0以下のみなら 0以下での最大値
 ・   〃             0より大きい数値のみなら単純に最大値

 で、いいんだよね?

 =IF(COUNTIF(A$2:A2,A2)=1,MAX(IF(A$2:A$10=A2,IF(COUNTIFS(A$2:A$10,A2,E$2:E$10,"<=0")=0,E$2:E$10,IF(E$2:E$10<=0,E$2:E$10)))),"")

 CTRL+SHIFT+ENTER
 
(GobGob) 2015/06/03(水) 09:56

 F列が、グループ内でE列の最上部の値を拾ってくれれば 話は早いんですケド。。

 あー。そういうこと。

 F2 =IF(COUNTIF(A$2:A2,A2)=1,E2,"")

 で、いいんでないの?

 ※てか、F列なしで E2 =IF(COUNTIF(A$2:A2,A2)=1,SUMIF(A2:A$10,A2,D2:D$10),"")
   でもいいね。
 
(GobGob) 2015/06/03(水) 10:10 ⇒ 10:22修正

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

 ・A列グループのE列が0以下のみなら 0以下での最大値
 ・   〃             0より大きい数値のみなら単純に最大値

申し訳ございません。
F列の値を算出するための、E列に対する私のロジックが間違っていました。。

F列の結果としては
A列グループのD列の合計を、グループ内の最上部のみに表示する
だけです。
「E列の最大値を探す」というのは
A列グループ内のF列の最上部以外を空白にするためだけの
ロジックとして考えていました。。

なのでE列を以下の数式と、GobGobさんから頂いたF列の数式を組み合わせて
図4のケースで試行すると、上記の私の期待した結果は得られませんでした。

E2=SUMIF(A2:$A$10,A2:$A$10,D2:$D$10)

 ★図4

      A       B       C        D        E        F

 1  [name] [money] [money2] [total2] [total3] [total]
 2    a      -10      2        -8       -8       -8
 3    b        1      2         3        7       12  ←ココが7になることを期待している
 4    b      -10      2        -8        4          
 5    b       10      2        12       12            
 ・
 ・
 ・
 10

ところが
E列を以下の数式と、GobGobさんから頂いたF列の数式を組み合わせて
上記と同じ図4のケースで試行すると、私の期待した結果が得られました!

E2=SUMIF($A$2:$A$10,$A$2:$A$10,$D$2:$D$10)

 ★図4

      A       B       C        D        E        F

 1  [name] [money] [money2] [total2] [total3] [total]
 2    a      -10      2        -8       -8       -8
 3    b        1      2         3        7        7   ←good!
 4    b      -10      2        -8        7            ←(空白も)good!
 5    b       10      2        12        7            ←(空白も)good!
 ・
 ・
 ・
 10

いろいろなケースでテストしてますが、今のところ結果は良好です。

 ---------------------------

ここまで書き込み中
GobGobさんの

 >※てか、F列なしで E2 =IF(COUNTIF(A$2:A2,A2)=1,SUMIF(A2:A$10,A2,D2:D$10),"")
 >  でもいいね。

を確認しました。
コレです、コレ!。。ありがとうございました(笑)
(equity) 2015/06/03(水) 10:57


 一応。。。

 E列もなしに

 D2 =IF(COUNTIF(A$2:A2,A2)=1,SUMIF(A:A,A2,B:B)+SUMIF(A:A,A2,C:C),"")
 でもOKのような。。。。
 
(GobGob) 2015/06/03(水) 11:13

GobGobさん
ありがとうございます。

 >D2 =IF(COUNTIF(A$2:A2,A2)=1,SUMIF(A:A,A2,B:B)+SUMIF(A:A,A2,C:C),"")
 >でもOKのような。。。。

みるみる簡略化されてゆく。。(笑)
COUNTIFって便利ですね〜

ただ本番データはB列とC列だけではなく
約6個、列があります。
さらに基本的に2行を結合して1行のデータとして扱っており
結合されていない上段と下段のセルも混在している中で
合計を算出しているので
本番データの場合、F列なし止まりが個人的に良いかもです。

手動入力列が少ないor複雑ではない場合は
E列なしの構成が最高ですね!

(equity) 2015/06/03(水) 11:48 ⇒ 12:03修正


 結合している片方のセルにデータは無いんで問題ないのでは?

 =IF(COUNTIF(A$2:A2,A2)=1,SUMPRODUCT((A$2:A$10=A2)*B$2:G$10),"")
 
(GobGob) 2015/06/03(水) 13:00

GobGobさん
どうもです。

あと合計を算出するための複数の列は
連続していないんですよね。。
以下のように。。

 B C D E F  H

連続していない場合は、数式が長くなってしまうと
認識しています。
だったらF列なし止まりがキレイかな、と。
(equity) 2015/06/03(水) 13:32


 データ列で途切れてる列が空白または文字列なら

 =IF(COUNTIF(A$2:A2,A2)=1,SUMPRODUCT((A$2:A$10=A2)*1,B$2:H$10),"")

 で、問題ないだろけど。どーなんだろね。
 

(GobGob) 2015/06/03(水) 13:39


GobGobさん
まいどです。
本番データを簡易化したものが以下です。

 ★図5

      A       B       C        D        E        F        G        H        I

 1  [name] [money] [money2] [money3] [money4] [money5]  [char]  [money6] [total]

 2                    1                                            1
      a       1                1        1        1       moji            #VALUE!    ←「8」を期待する!
 3                    1                                            1
 -----------------------------
 4                    1                                            1
      b       1                1        1        1       moji            #VALUE!    ←「16」を期待する!
 5                    1                                            1
 -----------------------------
 6                    1                                            1
      b       1                1        1        1       moji                   
 7                    1                                            1
 -----------------------------

頂いた数式の

 B$2:H$10

の部分に無理があるのではないかと認識しています。
(equity) 2015/06/03(水) 14:44


 複数列だめっぽいね・・・(検証不足)

 I2 =IF(COUNTIF(A$2:A2,A2)=1,SUMPRODUCT((A$2:A$11=A2)*(TEXT(B$2:H$11,"標準;-標準;0;!0")+TEXT(B$3:H$12,"標準;-標準;0;!0"))),"")
 
(GobGob) 2015/06/03(水) 14:59

GobGobさん
ありがとうございます。
結果良好です!

しかし図5のB〜H列のいずれかに
見た目のみ日付として表示させたい以下の

 '06/04

を入力すると
I列で上記の日付を数値に変換し、
合計した値となってしまいます。
(B〜H列を選択して、ステータスバーに
表示されている合計値と異なっていることを確認しました)

頂いた数式の以下の部分が原因だと認識しています。

 "標準;-標準;0;!0"

上記の「!0」の部分が文字列の場合の
扱い・表示方法と認識しています。。
(また「!」の意味が不明でした)

(equity) 2015/06/04(木) 09:04


 日付(シリアル値)のみなら

 I2 =IF(COUNTIF(A$2:A2,A2)=1,SUMPRODUCT((A$2:A$11=A2)*(B$1:H$1<>G$1)*(B$2:H$11+B$3:H$12)),"")

 ※シリアル値と文字列 いろいろあるならTEXT併用。
 
 
(GobGob) 2015/06/04(木) 09:19 ⇒ 9:29 間違い訂正

 ちなみにTEXTの第2引数は関係ないよ。

 mojiが文字列でなくシリアル値なんで計算されてしまってるだけ。
 
(GobGob) 2015/06/04(木) 09:31

GobGobさん
本番データに全て結果良好で反映させることができました!

また、計算に使用する数値以外の
数値、日付、文字列などに
「'」を付与する必要なく
正しい合計値が表示されています。

ただ、E列なしの構成にしてから
処理速度が落ちました。

具体的には。。

・手動入力箇所(図5の場合、A〜H列、2行目以下)のセルに
 入力を行い、Enterあるいは他のセルをアクティブにする。

・手動入力箇所のセルの値をDeleteやBackspaceで削除する。

上記のいずれかを行うとステータスバーに

 再計算:(プロセッサ ▲ 個):■%

と表示されます。

本番データの行数は1000行、
2行を結合しているので500件のデータがあります。
しかし現在、入力されているのは6.5割ほどです。

また、印刷用に他のシートに50件ずつ(計10シート)以下の
数式で引っ張って表示させてます。

 =INDIRECT(ADDRESS(ROW(),COLUMN(◆参照セル◆),4,,"◆参照シート◆"))

理由は50件ずつの合計値を算出したいからです。

メモリは8GBです。

以下のURL に記載されている方法で回避できましたが
データ入力者は初心者なので、手動で再計算させる手間を
できるだけ省きたいです。。

 計算式が複雑でExcelが重い - インストラクターのネタ帳
 http://www.relief.jp/itnote/archives/000046.php

そもそもE列なしの構成で使用する数式が原因かも分かりませんが。。

(equity) 2015/06/04(木) 13:23


 まぁ、重くなるかもね。配列数式やから。 
 最初の質問から脱線してもーたし(レイアウト違いとか列数とか・・・)

 COUNTIF使って 作業列+SUMIF列でいいと思う。

 あと、一応

 > =INDIRECT(ADDRESS(ROW(),COLUMN(◆参照セル◆),4,,"◆参照シート◆"))

 =INDEX(◆参照シート!$1:$1048576,ROW(),COLUMN())

 でよさそうだけど。
(GobGob) 2015/06/04(木) 13:39

GobGobさん
おんぶにだっこ状態ですいません。。
(-_-;)

後継者にGobGobさん並のスキルの人が現れ、
簡略化・最適化してくれることを願うばかりです(笑)

以上、ありがとうございました。拍手!
(equity) 2015/06/04(木) 13:55


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.