難解なエクセル集計の仕方を教えてください!!

このQ&Aのポイント
  • エクセルでの集計方法が分かりにくい場合、以下の手順で集計を行うことができます。
  • 関係図を分解し、2つごとの関係に直したデータを元に、関係図に基づいた集計をすることができます。
  • 集計の例として、任意の要素を集計し、それ以下の要素も含めて集計する方法や、特定の要素の下位のみを集計する方法があります。
回答を見る
  • ベストアンサー

難解なエクセル集計の仕方を教えてください!!

以下のように集計したいのですが、いい方法はありませんか? 解りにくいですが、宜しくお願いします!!! ------------------------ 【関係図】  (1)(2)という2つグループの関係を表しています。  組織図のようなものと思ってくださって結構です。 ■元データ 【表あ】  関係図を分解し、2つごとの関係に直したデータです。   【表い】  それぞれA-Oに対応する数字が入っています。 ■集計要望 【表あ】と【表い】ふたつのデータを元に、関係図に基づいた集計をしたい。 例: 1.Aを集計すると、Aの下位のものはすべて集計したい。(A~Gまでの集計) 2.Dを集計すると、Dの下位のみが集計されるようにしたい。(D+E+F+G) 3.Fを集計すると、Fの下位のみ集計したい。(F+G) 4. Iを集計=I+K、Jを集計=J+L+M+N+O 【関係図】  (1)A-B-C      D-E       F-G  (2)H-I-K     J-L-M       N-O 【表あ】  A ― B  B ― C  B ― D  D ― E  D ― F  F ― G  H ― I  I ― K  H ― J  J ― L  L ― M  L ― N  N ― O 【表い】 A=1 B=2 C=4 D=5 E=6 F=7 G=8 H=9 I=10 J=11 K=12 L=13 M=14 N=15 O=16

noname#95828
noname#95828

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

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

まず「表あ」ですが、AとHが親であることを示すために、  - A A - B : : F - G  - H H - I のように変更します。B列を中心にして、すべての文字について自分 の直系の親が記載されているわけです。1行目は空けて2行目から表を 作ってください。で、C列を C2: =IF(ISERROR(VLOOKUP(A2,B1:C$2,2,0)),"",VLOOKUP(A2,B1:C$2,2,0))&B2 のようにすると、一番上の世代から自分に至る経路が表示されます。 「表あ」のB列にすべての文字が1度ずつ出てくるようになったのです から、「表い」は不要です。D列にでも数値を書いておけばオッケー ですね。でもまあ、後々のメンテナンスを考えて、 D2: =VLOOKUP(B2,表い,2,FALSE) とでもしておきましょうか。 さて、いよいよ結果です。文字"A"の集計値は =SUMPRODUCT(1*NOT(ISERROR(FIND("A",$C$2:$C$16))), $D$2:$D$16) となります。find()関数で探している"A"を適当に置き換えればどの 文字でも探せます。Aは33、Dは26、Fが15でIが22、Jは69になりまし た。こんな感じでいかがでしょう。

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

#4です。VBAで表を作ってみました。 (2者関係=表あ) A,B、C・・・を数値1,2、・・に(都合で)置換えました。 Sheet1のA1:B13に 1 2 2 3 2 4 4 5 4 6 6 7 8 9 9 11 8 10 10 12 12 13 12 14 14 15 Sheet2にA2:A16にA-O、B1:P1に A-Oを入れておきます。 (コード) Sub TEST01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("sheet1") Set sh2 = Worksheets("sheet2") sh1.Range("c1:c15").ClearContents sh2.Range("b2:o15").ClearContents GoTo p01 p02: For i = 13 To 1 Step -1 If sh1.Cells(i, "B") = R Then sh1.Cells(i, "C") = 1 sh2.Cells(R + 1, R + 1) = 1 L = sh1.Cells(i, "A") sh2.Cells(L + 1, L + 1) = 1 For k = 2 To 16 If sh2.Cells(R + 1, k) = "" Then Else sh2.Cells(L + 1, k) = sh2.Cells(R + 1, k) End If Next k End If L = R Next i '--- p01: For j = 13 To 1 Step -1 If sh1.Cells(j, "C") = "" Then sh1.Cells(j, "C") = 1 R = sh1.Cells(j, "B") GoTo p02 End If Next j End Sub (結果) A B C D E F G H I J K L M N O A 1 1 1 1 1 1 1 B 1 1 1 1 1 1 C 1 D 1 1 1 1 E 1 F 1 1 G 1 H 1 1 1 1 1 1 1 1 I 1 1 J 1 1 1 1 1 K 1 L 1 1 1 1 M 1 N 1 1 O 1 この表もOKWEBでは列が崩れるでしょう。 #4での誤りが(正しくはL11はブランク。Jは69)見つかりました。

回答No.5

#1で回答した者です。 #2さんの仰るようにフォーマットを変えれるのであれば   親 値 合計 A - 1 =C2+SUMIF($B$2:$B$16,A2,$D$2:$D$16) B A 2 =上のセルをコピー貼り付け(以下同じ) C B 4 D B 5 E D 6 F D 7 G F 8 H - 9 I H 10 J H 11 K I 12 L J 13 M L 14 N L 15 O N 16 のように1つの表でできます。 (1行目は見出しとして2行目から[A]が入力されています)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

変数をAからOの15個使う例とします。間の列で飛んでいて(使わない変数があっても)も良い。 第1行と第1列はAからOまでの見出しを(判りやすくするため)セットします。 (1)そして変数の値を第2行目にセットします。 B2=1、C2=2、・・以下「表い」に書いておられる通りです。 (2)そして求める(行うべき計算)式は、単純に加算だけですから、足すか足さないかの表情報を作れば、計算できます。 該当列が加算する場合は1、加算しない場合は0(または空白。本回答ではこちらを採用)をセットすれば良いのです。 (3)その表はA3:P17の15行に作ることにします。 例えば質問例ではDについてのその情報がD+E+F+Gですから、 D6、E6、F6、G6に1を入れます。 (4)すると=SUMPRODUCT($B$2:$P$2*B6:P6)で求めるものが求まります。$は必要です。 (5)Aに付いての答えは=SUMPRODUCT($B$2:$P$2*B3:P3)です。 (6)Bに付いては=SUMPRODUCT($B$2:$P$2*B4:P4)ですから、式の複写をすると良いのです。したがってAからOまでの値は、式の複写で一発で求められます。 (7)それで結局(3)の表をどのようにして作るかが残された問題です。 関数では難しいと思いVBAで組もうとしましたが、複雑そうで出きれば 考えます。 (8)取りあえず私が(人間が)表を作ってみました。 A B C D E F G H I J K L M N O 1 2 4 5 6 7 8 9 10 11 12 13 14 15 16 A 1 1 1 1 1 1 1 B 1 1 1 1 1 1 C 1 D 1 1 1 1 E 1 F 1 1 G 1 H 1 1 1 1 1 1 1 1 I 1 1 J 1 1 1 1 1 1 K 1 L 1 1 1 1 M 1 N 1 1 O 1 (OKWEBでは上表はメチャメチャに成るかもしれませんが、「1」の入るべきセルを推定してください。) (結果) A 33 B 32 C 4 D 26 E 6 F 15 G 8 H 100 I 22 J 81 K 12 L 58 M 14 N 31 O 16 M 14 N 31 O 16 (その他) この問題は「データ構造」の「多分木」(本件では2分木)の構造が背景にあるものと思われれます。 親(上位)は1つしかないことに特徴が出ています。 よほど数学や論理学的にしっかりした理屈で考えないと 頭がこんがらがるが、奥が深い種類のテーマです。コンピュータメモリに実装する方法も、WEB上でも(有名な問題の割には)見つからなかった。 この本質問の問題をデータベースに組みこむと、例えば部品ヒエラルキーにおける、任意の部品(ブロック)の価格総額が計算できますね。

  • zinchan
  • ベストアンサー率49% (97/197)
回答No.3

 2関係から、全体を把握することで、集計を困難にしているように思います。  いっそ、表いに、表あの関係を組み合わせた、全体の上位下位のつながりが理解しやすいような表を作成したらいかがでしょうか。  例えば、AはBとの直接関係しかないが、BはCとDに関係し、Cの下位はないがDにはE、Fと関係があるということでは、計算上、AとC、AとD、AとE・F等、間接的な関係および全体の関係がつかめません。よって、集計上間接的に関係するグループをそれぞれ表の列にまとめたらいかがでしょうか。  下記のような表を新たに作成し、「表い」に相当する部分は項目名とその数値を入力しておき、その左にA~Oまでの直接・間接的な関係を一連で記号(としての数値)にして列で入力しておきます。すなわち、「表あ」の直接関係をはずし、間接関係にまで及ぶ表を、「表い」に付け加える様式です。  例えば、一行目に記載されたA~OのAにはA~Gで一グループ、BにはB~Gで一グループ、CはBの下位でCの下位には何もないのでC単独、DにはD~Gで一グループという関係が一目で判別できる表です。 例  値 A B C D E F G H I J K L M N O A 1 1 B 2 1 1 C 4 1 1 1 D 5 1 1   1 E 6 1 1   1 1 F 7 1 1   1   1  G 8 1 1   1   1 1 H 9            1 I 10            1 1 J 11            1 1 1 K 12            1 1 1 1 L 13            1   1   1 M 14            1   1   1 1 N 15            1   1   1   1 O 16            1   1   1   1 1  1行目のA列の同列最上行か最下行に、 =SUMIF(C2:C16,1,$B$2:$B$16) ※ C2:C16はそれぞれ関係グループを表す列の範囲、$B$2:$B$16はA~Oの値の範囲として置き換えてください。 と入力し、Oの列までコピーします。  直接、間接関係に及ぶグループの、それぞれの値を合計した値がそこに表示されます。  この方法のメリットは、関係に変化が生じた場合、簡単に表の数値を入れ替えられ、集計式の変更をしなくて済む点にあります。また、新たな項目が増えても、表を拡大して集計式をコピーすれば済むので、メンテナンスが楽な点もあります。  デメリットは、直接関係以外にも間接関係等全体の関係を把握して、関与するグループ全てに同じ記号をつけなければならないのが面倒な点です。  しかし、いずれにしろ関係図が書けるのであればその把握は容易ですし、逆に関係の全体を把握しやすく、集計も難しく考えずに済むので、メリットの方が大きいと思うのですが、いかがでしょうか。

回答No.1

もっと簡単な方法があったらすみません。 結果が[Sheet2]のC列に表示されます。 [Sheet1](表あ) A列 B列 C列  A  B  =VLOOKUP(B1,Sheet2!$A$1:$B$15,2,FALSE)+SUMIF($A$1:$A$13,B1,$C$1:$C$13)  B  C  1行目をコピー貼り付けしてください  B  D  〃  ・・・・・・・・・ [Sheet2](表い) A列 B列 C列  A  1  =B1+SUMIF(Sheet1!$A$1:$C$13,A1,Sheet1!$C$1:$C$13)  B  2  1行目をコピー貼り付けしてください。  C  4  〃  ・・・・・・・・・ いかがでしょうか?(考え方が違っていたら補足してください)

関連するQ&A

  • エクセルの使い方についてお教えください。

    エクセルの使い方についてお教えください。 例えば、 a | b | f c | g | j d | h | k | m e | i | l | n | o | のように、右肩下がりになっている列を、 a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | のように一列にまとめる方法は無いでしょうか? 何卒よろしくお願いいたします。

  • EXCELの表で縦横の入れ替え方法

    EXCELの表で 縦軸と横軸を入れ替える方法ってありますか? つまり A B C D E F G H I J K L っていう表を A E I B F J C G K D H L にしたいのです。

  • エクセルの関数でピボットテーブルのような集計

    以下のようなテスト結果の表(DB)があります。 列:A,B,C,D,E,F,G,H,I,J,K,L,M,N,O   ,,,,1700,小野,,,,2,,0,A,B,0   ,,,,1200,小野,,,,4,,1,C,0,C   ,,,,1700,柴田,,,,5,,4,A,B,0   ,,,,1400,矢野,,,,3,,4,B,0,A   ,,,,1200,伊藤,,,,4,,1,C,D,0,   ,,,,1000,田村,,,,4,,3,D,C,A F列には、名前がフルネームで入力されています。同一人物が複数あります。 J列には、数字が1,2,3,4 L列には、A,B,C,D,E M列には、A,B,C,と数字の0 N列には、A,B,C,と数字の0 O列には、A,B,C,と数字の0 が、それぞれ入力されています。 このDBを元に L,M,N,Oのデータの個数を名前別に以下のように集計をしたいのです。      J , L , M ,N,O 名前,1,2,3,4,計,A,B,C,D,E,計,A,B,C,0,計,.... 小野, ピボットテーブルで考えましたが、5回行わねばならず、結合も考えると関数で何とかならないものか と質問させていただきました。 別に関数でなくても、もっと有効な方法がありましたらそれで結構です。御教示下さい。

  • エクセルについて

    エクセルで A B C D E F G H I J K L M N O P Q R … と並んでいるデータを A B C D E F G H I J K L … のように並べ変えたいのですが、最も効率のよい方法を教えてください。 上記のアルファベット1つにセル1つです。 Office2007を使用しています。 以上、宜しくお願い致します。

  • EXCELにて、平日のみの集計をしたい

    どうやってもわからなかったので・・・ 以下のような表を作っています   A  B  C  D  E  F  G  H  I  J  K  L 1 品名 7/21 7/22 7/23 7/24 7/25 7/26 7/27 7/28 平日 休日 合計  2    火  水 木 金  土 日  月 火 3    1  0  2  4  1  1  1  1  9  2  11 J3セルに平日の数量のみを集計する数式を設定したいのです L3にはSUM関数で合計を、K3にはL3-J3で集計を出すようにしたいです (A列には商品名が入ります) 祝日も休日にカウントしたいので、別シートに休日一覧をシリアル値で入力してあります 休日一覧のシートはA1~A22までの範囲にシリアル値を入れてあります (祝日の日数より多く範囲設定しているのは定休日なども設定するためです) よろしくお願いします

  • エクセル マクロでセルを自動移動

    例1のようになっているエクセル表があります。 データは右方向、下方向へ増えます。 Cの列以降は4つ単位でしかデータは増えません。 それを例2の表のように列A,Bのデータはそのままに Cの列以降の4つのセルを区切りに下の行に移動して、 空白の列まで言ったらA2の行以降を最後の行まで繰り返しするという マクロを書くことは可能でしょうか。 出来ましたらそのマクロを教えてください。 例1 A1 B1 C1 D1 E1 F1 G1 H1 I1 J1 K1 L1 M1 N1 A2 B2 C2 D2 E2 F2 G2 H2 I2 J2 A3 B3 C3 D3 E3 F3 G3 H3 I3 J3 K3 L3 M3 N3 例2 A1 B1 C1 D1 E1 F1 A1 B1 G1 H1 I1 J1 A1 B1 K1 L1 M1 N1 A2 B2 C2 D2 E2 F2 A2 B2 G2 H2 I2 J2 A3 B3 C3 D3 E3 F3 A3 B3 G3 H3 I3 J3 A3 B3 K3 L3 M3 N3

  • Excelで飛び飛びのセル(列)を参照したいのですが…その2

     ある「sheet1」で、G1="A",H1="B",I1="C",J1="D",K1="E",L1="F",M1="G",N1="H",O1="I",P1="J",Q1="K",・・というように文字が入力されているとすると、5列飛びの値A,F,K・・・(G1,L1,Q1・・・)が欲しいのです。そして、その値が「sheet2」に、C5=A,D5=F,E5=K,F5=P・・・となるようにしたいのです。ただ数値が5ずつ増加するのではなく、そのセルに入力されている文字列を参照したいのです。  それをまた、「sheet1」の、G2="A",H2="B",I2="C",J2="D"・・・の値でも同じ事をしたいのですが・・・。  よろしくお願いします。

  • 2行のセルの入れ替え。

     初めまして、よろしくお願いします。  セルに A B C D E F G H I J K L 1 a b c d e f 2 g h i j k l 3 m n o p q r 4 s t u v w x 5 " ・ " ・ " ・ " 100 "  という表があります。これを A B C D E F G H I J K L 1 a b c d e f g h i j k l 2 m n o p q r s t u v w x 3 " 4 " 5 " ・ " ・ " ・ " 100 "  という風に、偶数行のデーターを奇数行の後ろにつけるようにしたいと思います。無理ならば奇数行だけのデーター、偶数行だけのデーターとなるように、何かよい方法を教えて頂きたく、よろしくお願いします。

  • エクセルVBAについて教えてください

    エクセル2003 シート1     A       B      C 1  3月1日 A 100     *A列はカレンダーコントロールより選択としています 2  4月1日 B 100 3  3月1日 C 200     *B列はコンボボックスより選択としています 4  3月1日 D 200 5  4月1日 E 300     *C列は直接入力としています 6  4月1日 F 300 7  3月1日 G 100 8  4月1日 H 200 9  3月1日 I 200 10  4月1日 J 100 上記シート1の表のC列を下記シート2のC列に条件集計する シート2    A       B       C 1  3月1日   A~E     500    *選択した日付ごと及びA・B・C・D・Eの集計  2  3月1日   F~J     300    *選択した日付ごと及びF・G・H・I・Jの集計     3  4月1日   A~E     400    *選択した日付ごと及びA・B・C・D・Eの集計    4  4月1日   F~J     600    *選択した日付ごと及びF・G・H・I・Jの集計  すいませんが上記コードを教えてください 困ってます よろしくお願いします      

  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

専門家に質問してみよう