dポイントプレゼントキャンペーン実施中!

以下のように集計したいのですが、いい方法はありませんか?
解りにくいですが、宜しくお願いします!!!

------------------------
【関係図】
 (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

A 回答 (6件)

まず「表あ」ですが、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になりまし
た。こんな感じでいかがでしょう。
    • good
    • 0

#4です。

VBAで表を作ってみました。
(2者関係=表あ)
A,B、C・・・を数値1,2、・・に(都合で)置換えました。
Sheet1のA1:B13に
12
23
24
45
46
67
89
911
810
1012
1213
1214
1415
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
(結果)
ABCDEFGHIJKLMNO
A1111111
B111111
C1
D1111
E1
F11
G1
H11111111
I11
J11111
K1
L1111
M1
N11
O1
この表もOKWEBでは列が崩れるでしょう。
#4での誤りが(正しくはL11はブランク。Jは69)見つかりました。
    • good
    • 0

#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]が入力されています)
    • good
    • 0

変数を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)取りあえず私が(人間が)表を作ってみました。

ABCDEFGHIJKLMNO
1245678910111213141516
A1111111
B111111
C1
D1111
E1
F11
G1
H11111111
I11
J111111
K1
L1111
M1
N11
O1
(OKWEBでは上表はメチャメチャに成るかもしれませんが、「1」の入るべきセルを推定してください。)
(結果)
A33
B32
C4
D26
E6
F15
G8
H100
I22
J81
K12
L58
M14
N31
O16

M14
N31
O16
(その他)
この問題は「データ構造」の「多分木」(本件では2分木)の構造が背景にあるものと思われれます。
親(上位)は1つしかないことに特徴が出ています。
よほど数学や論理学的にしっかりした理屈で考えないと
頭がこんがらがるが、奥が深い種類のテーマです。コンピュータメモリに実装する方法も、WEB上でも(有名な問題の割には)見つからなかった。
この本質問の問題をデータベースに組みこむと、例えば部品ヒエラルキーにおける、任意の部品(ブロック)の価格総額が計算できますね。
    • good
    • 0

 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の列までコピーします。
 直接、間接関係に及ぶグループの、それぞれの値を合計した値がそこに表示されます。
 この方法のメリットは、関係に変化が生じた場合、簡単に表の数値を入れ替えられ、集計式の変更をしなくて済む点にあります。また、新たな項目が増えても、表を拡大して集計式をコピーすれば済むので、メンテナンスが楽な点もあります。
 デメリットは、直接関係以外にも間接関係等全体の関係を把握して、関与するグループ全てに同じ記号をつけなければならないのが面倒な点です。
 しかし、いずれにしろ関係図が書けるのであればその把握は容易ですし、逆に関係の全体を把握しやすく、集計も難しく考えずに済むので、メリットの方が大きいと思うのですが、いかがでしょうか。
    • good
    • 0

もっと簡単な方法があったらすみません。


結果が[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  〃
 ・・・・・・・・・

いかがでしょうか?(考え方が違っていたら補足してください)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!