• 締切済み

条件付きグループ集計

関数で以下のようなことができるでしょうか。 ピボットテーブル, vbaは使用しない前提でお願いします。 以下のようなDataから、情報を得たいと考えます。 Data 感覚としては、A列がグループ番号, B列が当該グループの参加者の達成率のような感じです。 A B 1 50% 1 70% 1 0% 2 10% 2 35% 3 100% 3 70% 3 20% 入力: x[%] 出力 y1: B列がx[%]以上のレコードが含まれるグループ数 y2: 件数上位1グループの件数占有率 この場合、 x=100なら、出力y1=1, y2=100% x=50なら、出力y1=2, y2=50% x=10なら、出力y1=3, y2=14% となります。 Dataのc列以降に関数等を入力して加工する分には構いません。

みんなの回答

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

 SUMPRODUCT関数や配列式は、処理の対象としている行数が多くなりますと、処理が重くなるという短所があります。  御質問の件の場合、使用するExcelのバージョンがExcel2007以降のものであり、尚且つ、作業列を使用しても構わないのでしたら、SUMPRODUCT関数や配列式を使う必要は御座いません。  今仮に、xの値をE1セルに入力すると、G列を作業列として使用して、y1の値がE2セルに、y2の値がE3セルに、それぞれ表示される様にするものとします。  まず、G2セルに次の関数を入力して下さい。 =IF($A2="","",IF(AND(COUNTIF($A$1:$A2,$A2)=1,COUNTIFS($A:$A,$A2,$B:$B,">="&$E$1)),COUNTIFS($A:$A,$A2,$B:$B,">="&$E$1),""))  次に、G2セルをコピーして、G3以下に貼り付けて下さい。  次に、E1セルとE3セル(E2セルは除く)の書式設定の表示形式を[パーセンテージ]に設定して下さい。  次に、E2セルに次の関数を入力して下さい。 =COUNT($G:$G)  次に、E3セルに次の関数を入力して下さい。 =IF(COUNT($G:$G),MAX($G:$G)/COUNTIF($B:$B,">="&$E$1),"")  以上です。  因みにこの方法の場合は、件数の多さで同数1位のグループが複数存在していても、1つのグループが占有している件数を基にした件数占有率が表示されます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

ご要望のことができる関数はないので、数式を作る必要があります。作業列を用意しない場合は、次のとおり、できることはできますが難解です。したがって作業列を用意しない方法は別にお勧めではなく、参考のみですので、ベストアンサーは辞退します。 F1 50 など F2 =ROUND(SUMPRODUCT(1/(COUNTIFS(A1:A30,A1:A30,B1:B30,">="&F1)+9^9*((A1:A30="")+(B1:B30="")+(B1:B30<F1)>0))),) F3 =100*MAX(INDEX(COUNTIFS(A1:A30,A1:A30,B1:B30,">="&F1),))/COUNTIF(B1:B30,">="&F1) なお上式においても、No.1 さんと同じく、x=10 のとき y2≠14 です。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! なかなか回答がつかないようなので・・・ >y2: 件数上位1グループの件数占有率 の解釈が違うかもしれません。 ↓の画像でいえば、B列のデータでE1セルに入力した数値以上で最大値のグループのE1セル以上のデータ数を B列全体のE1セル以上のデータ数で割った割合と解釈しました。 すなわち画像ではB列に50%以上のデータが4個存在し、その中で最大値のグループは100%の「3」になりますので 「3グループ」のデータで50%以上の数(2個)を全体の50%以上(4個)で割っています。 となるとE1セルに10%を入力した場合、y2は14%にならないので外している可能性が高いのですが、 あえてたたき台として投稿してみます。 画像のように作業列を1列設けます。 作業列のC2セルに =IF(AND(B2>=E$1,B2=MAX(IF(A$2:A$1000=A2,B$2:B$1000))),A2,"") これは配列数式になりますので、Ctrl+Shift+Enterで確定! これをオートフィルでずぃ~~~!っと下へコピーしておきます。 そしてE4セルに =COUNT(C:C) F4セルに =SUMPRODUCT((B1:B1000>=E1)*(A1:A1000=OFFSET(C1,MATCH(MAX(B:B),B:B,0)-1,,1)))/COUNTIF(B:B,">="&E1) という数式を入れています。 ※ 最大値が複数ある場合はめちゃくちゃな表示になると思います。 ※ 一発で解決!とはいかないと思いますが、とりあえずはこの程度で・・・m(_ _)m

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルのデータ集計で悩んでます。

    エクセルのデータ集計で悩んでます。 下記のデータがあったとします。 a b c あ A x あ A y あ A z あ B x い A x い B y このとき、a列とb列で重複するデータを排除してデータ件数を カウントしたいと思います。 つまり、この例ですと あA・・・1件 あB・・・1件 いA・・・1件 いB・・・1件 とどこかの空エリアに表示させる方法はありませんでしょうか? どなたかご指導よろしくおねがいします。

  • Excel関数 2つの条件で集計するには?

    エクセル関数についての質問があります。 A列に赤・黄・青のいずれか B列に○・△・□のいずれか C列に数値のデータが入力されているとします。 このとき、A列が赤且つB列が○となっている 数値を集計する関数もしくは方法はありますか? SUMIFでは条件は一つしか使えませんよね? 現在はC列の数値を、B列が○のときはD列に B列が△のときはE列に、B列が□のときはF列に 表示させるようにし、B列をキーにD~F列の数値 をそれぞれ集計しています。 件数が多いときはめんどうなので、いい方法が ありましたら、教えてください。 よろしくお願いします。

  • Excelマクロ 別シートでの複数条件の選択

    いろいろ検索してみましたが、以下の条件でデータ分析する時にどのようなマクロ関数を書けばよいのか分からないので、教えて下さい。 例えば「シート1」に生データがあって、「シート2」にその結果を表示させようと思います。 「シート1」のA列に、XとYが交互にあったとします。 その横のB列に、1,2,3があったとします。 その中から「A列のXとB列の1」「A列のXとB列の2」…「A列のYとB列の3」の組み合わせの個数を、「シート2」にそれぞれ表示させたい場合、どのようなマクロ関数を作成すればよいでしょうか?

  • EXCELで関数だけの集計を行いたい。

    こんにちは。 エクセル(VER97以上)の関数のみを使用して(マクロを使わず) 以下のような集計を実現したいのですが可能でしょうか? シート1 A B 1 日付 内容 2 2001.11.27 データ1 3 2001.11.27 データ2 4 2001.11.27 データ3 5 2001.12.03 データ1 6 2001.12.03 データ2 7 2001.12.03 データ3 8 2001.12.15 データ1 9 2001.12.15 データ2 10 2001.12.15 データ3 11 2001.12.15 データ4 12 2001.12.15 データ5 13 2001.12.15 データ6 シート2 1 日付 件数 2 2001.11.27 3 3 2001.12.03 3 4 2001.12.15 6 5 総合計 12 (Tab区切りデータです) シート1に入力した日付データをシート2に日付でグループ化して データ件数を集計したいのですが関数で行おうとするとかなり難し そうですが、うまい関数を使えば出来そうな気もします。 実現可能でしょうか? よろしくお願いします。

  • SELECT 文 GROUP での1件目を取得

    非常に初歩的な事で恐縮ですが、 以下のデータを抽出するsql文の書き方を模索しています。 環境:SQLSERVER2005 | 列1| 列2 | +---+---+ | 1 | A | | 1 | B | | 1 | C | | 1 | D | | 2 | F | | 2 | G | | 2 | H | | 3 | X | | 3 | Y | | 3 | Z | 上記のテーブルがあるとします。 列1でグループした値で、1レコード目の列2を抽出したいのです。 出力結果としては、 列1列2 +--+--+ 1,A 2,F C,X としたいのです。 列1でGROUPしてしまうと列2の内容を集約しないといけないので困っています。 ご教授いたけないでしょうか?

  • グループごとの集計、全体の集計について

    いつもお世話になっております。 VBAでの課題で行き詰ってしまったので、どなたかお力をお貸しいただけないでしょうか? コードの効率のよい書き方が分からないため 非常に長くなってしまいますが、すべて書かせていただきます。 課題は A グループ1 商品1    300000 A グループ1 商品2    460000 A グループ2 商品1    120000 A グループ2 商品2     80000 A グループ3 商品3     71000 B グループ1 商品1    200000 B グループ1 商品2    208000 B グループ2 商品1     2300 となっている表を A グループ1 商品1    300000 A グループ1 商品2    460000   グループ1        760000 A グループ2 商品1    120000 A グループ2 商品2     80000   グループ2        200000 A グループ3 商品3     71000   グループ3         71000 支店A            1031000 B グループ1 商品1    200000 B グループ1 商品2    208000   グループ1        408000   B グループ2 商品1     2300   グループ2         2300 支店B            410300 合計(A+B)        1441300 このように、グループが変わるとグループ合計を出し、 支店名が変わると支店合計を出し、 最終的にすべての合計を出力するコーディングをしています。 今回は配列変数を使わないということなのですが 以下のような流れで考えました '変数の宣言 Dim X As String Dim Y As String Dim siten_A As String '支店名 Dim siten_B As String Dim kubun_A As String '区分 Dim kubun_B As String Dim syohin_A As String '商品名 Dim syohin_B As String Dim kingaku_A As Long '金額 Dim kingaku_B As Long Dim k_goukei As Long '区分合計 Dim s_goukei As Long '支店合計 Dim goukei As Long '合計 'ファイルを開く Open "C:\My Documents\INFILE.txt" For Input As #1 Open "C:\My Documents\OUTFILE.txt" For Output As #2 '1行目を読み込み、変数に格納 Line Input #1, X siten_A = Left(X, 10) kubun_A = Mid(X, 11, 10) kingaku_A = Right(X, 8) syohin_A = Mid(X, 21, 15) Do Until EOF(1) '2行目以降を読み込み変数に格納 Line Input #1, Y siten_B = Left(Y, 10) kubun_B = Mid(Y, 11, 10) kingaku_B = Right(Y, 8) syohin_B = Mid(Y, 21, 15) If siten_A = siten_B And kubun_A = kubun_B Then Print #2, siten_A & kubun_A & syohin_A & kingaku_A k_goukei = kingaku_A + kingaku_B kingaku_A = kingaku_B siten_A = siten_B kubun_A = kubun_B syohin_A = syohin_B ElseIf siten_A = siten_B And kubun_A <> kubun_B Then Print #2, siten_A & kubun_A & syohin_A & kingaku_A s_goukei = s_goukei + k_goukei k_goukei = k_goukei Print #2, k_goukei siten_A = siten_B kubun_A = kubun_B syohin_A = syohin_B kingaku_A = kingaku_B Else Print #2, siten_A & kubun_A & syohin_A & kingaku_A Print #2, k_goukei s_goukei = s_goukei + k_goukei Print #2, s_goukei siten_A = siten_B kubun_A = kubun_B syohin_A = syohin_B kingaku_A = kingaku_B End If Loop Print #2, siten_A & kubun_A & syohin_A & kingaku_A k_goukei = k_goukei + kingaku_A Print #2, k_goukei s_goukei = s_goukei + k_goukei Print #2, s_goukei goukei = goukei + s_goukei Print #2, goukei Close #1 Close #2 End Sub となっています。 これを実行すると、各レコードを出力した後に 合計を出したいのですが 各レコードの金額が、一つ前の金額に足されたものになっており 期待通りの出力ができません。 前半で間違っているため、後半の支店合計や全体の合計も 変わってきてしまい、どこをなおせばよいかわからない状態です。 VBは初心者なので、長くなってもかまわないので 教えていただければと思います。 長くなりましたが、よろしくお願いします。

  • この条件を抽出できるエクセルの式を教えてください

    A列(A2からA602)にグループ名、B列(B2からB602)に対応日が入っているデータがあります。ただし、未対応の場合には日づけは空欄です。 今、A列であるグループを抽出し、B列にまだ日付が入っていない(未対応)の件数を出したいのです。 COUNTIF(A2:A602,"抽出したいグループ名")とCOUNTBLANK(B2:B602)あたりの関数を使うのかな・・・と思って試行錯誤してみましたが、数式ができません。 アドバイスをお願いします。

  • Excel関数で複数条件指定時の式を教えてください

    Excel関数での複数条件指定時の式を教えてください。 A列   B列 DD     ID あ     あ 12    12 ー     11 11     ー ー    ー  このようなデータが入った表から以下の条件でデータを抽出できる関数はありますでしょうか? (1)A列に文字、数字が存在してB列にも文字、数字が存在するデータの件数を求める。 (2)A列に文字、数字が存在してB列に ー が存在するデータの件数を求める。 (3)A列に - が存在してB列にも ー が存在するデータの件数を求める。 ご存知の方がいらっしゃいましたらよろしくお願いします。 Excelは2003を使用しています。

  • ピボットテーブルの集計結果を使って、さらに条件を付けて集計をしたいです

    ピボットテーブルの集計結果を使って、さらに条件を付けて集計をしたいです。 たとえば、このようなピボットテーブルから、 [A]      [B]       [C]       [D]                         1月 Group  Account1   Account2 G0    田中         東京     5         加藤         大阪     2 G1     佐藤        大阪      3 G1    田中         名古屋       A列のGroupをキーにして、D列を集計します。 G0の合計は7で個数は2、G1の合計は3で個数は1、という結果を出すにはどのようにしたら良いでしょうか?

  • エクセルでこんな集計できますか?

    会社の営業成績の表を作成しているのですが 個人別に担当物件数とその合計金額を出したいと思っています。 例えば以下のような表があります。 A列に名前、B列に金額を入力しています。 A列     B列 山田    3000 山田    5000 田中    3000 鈴木    3000 田中    4000 山田    5000 鈴木    3000 というような表から 山田  3件 13000 田中  2件  7000 鈴木  2件   6000 といった感じで個人別に件数と合計金額を出したいのです。 件数はCOUNTIF関数で簡単に出るのですが金額の出し方が分かりません。 分かる方いらっしゃいましたらご指導お願いいたします。  

専門家に質問してみよう