How to find directional roots of a tree using Excel?

谁说我不能喝 提交于 2020-06-21 05:45:09

问题


I have the following question. Thank you for helping

There is a tree with directional roots from bottom to top. How can find all connections (in pairs) by using Excel?

For example, for column E-> for the child 12; 12-9, 12-6, 12-3 and 12-1, for the child 9; 9-6, 9-3 and 9-1, for the child 6; 6-3 and 6-1, for the child 3, 3-1 are the connections.

What am I supposed to write to L2 and M2 to copy down? (it should not have blank or repeating connections)

Thank you for helping.


回答1:


Big Picture : Stage1 : list all possible pairs for each column | Stage2 : combine the pairs & remove duplicate | Stage3 : put result in the desired format (L & M list..)

[[ Stage 1 ]]

Idea : load the original list[A] > generate index# for L & M [B] > load L & M value using index# [C]

Assuming the data is exactly located as per in table1 in Sheet. Do all these in Sheet2..

[ Creating the template ]

  • type "choose" in A1

    type "list :" in D1

    type "how many item :" in A7

    type "how many possible pairs :" in A9

put :

=IF(LEN(OFFSET(Sheet1!$A$1,ROW()-1,$B$1-1))=0,"",OFFSET(Sheet1!$A$1,ROW()-1,$B$1-1)) in E1 and drag until E5

table E1 is the "load the original list" [A] part.

Then :

=COUNT(E1:E5) in D7
=COMBIN(D7,2) in D9

Now, start part [B] : "generate index# for L & M"

Then:

  • type "generate list" in A11

    type "#" in A13

    type 1 in A13

    type "L" in K13

    type "M" in L13

put in these formulas :

=IF(A14<$D$9,A14+1,"") in A15 and drag until A24

then :

=D7 in C13
=C13-1 in C14

=IF(COUNTIF($C$14:C14,C14)=C14,C14-1,C14) in C15 and drag until C24

then :

=$C$13-C14 in D14 and drag until D24
=INDEX($E$1:$E$5,D14) in E14 and drag until E24

=IF(E14<>E13,G13+1,G13) in G14 and drag until G24
=COUNTIF($G$14:G14,G14)+G14 in H14 and drag until H24
=INDEX($E$1:$E$5,H14) in I14 and drag until I24

End of part [B], "generating the index#".

Lastly..

=IF(A14="","",E14) in K14 and drag until K24
=IF(A14="","",I14) in L14 and drag until L24

Column I&E is the [C] part, "load L & M value using index#" . Where column K&L is the 'cleaned' version

Done creating the template.. for better comprehension.. do these..

  • type "use "how many item" value to generate "index #"" in C26

    type "sort the output list as per wanted format" in K26

    type "generate index #" in D27

    type "get L value from list using index #" in E28

    type "get item count from value list" in G30

    type "use "item count" value to generate "index #"" in H31

    type "get M value from list using index #" in I32

[ Using the template ]

To use, enter the column number 1 - 10 in cell B1, and the result is in K13 table..

[ Note ]

This is to generate pairs list for 1 column.. you may extend it another column, by doing the same in sheet3. Change the B1 (select column) value in sheet3 to see/manipulate the result/list in K13 table.

Do it till finish & try to understand each part of the formula.., ask if u r stuck /(^_^)

some ref :

https://exceljet.net/index-and-match

https://exceljet.net/excel-functions/excel-combin-function


[[ Stage 2 ]]

Idea : generate address for each sheet > use indirect() to load list as a combined list

Steps : Copy the above to sheet3 and choose column 2 (column 1 in Sheet2).. then repeat.. Sheet4 > Column 5.. Sheet6 > Column 5 .. until Sheet10.. Now create Sheet11 and do these..

  • type "Sheet[x]" in A1

    type "2" in A2

    type "Column#" in B1

    type "1" in B2

    type "SheetAddrs" in C1

    type "AddrsOfColmnK" in E1

    type "AddrsOfColmnK" in F1

    type "how many pairs listed per column" in H1

    type "from" in J1

    type "1" in J2

    type "to" in K1

Then :

=A2+1 in A3 and drag until A10 =B2+1 in B3 and drag until B10 ="Sheet"&A2&"!" in C2 and drag until C10 =C2&"K:K" in E2 and drag until E10 =C2&"L:L" in F2 and drag until F10 =COUNT(INDIRECT(E2,TRUE)) in H2 and drag until H10 =J2+H2-1 in K2 and drag until K10 =K2+1 in J3 and drag until J10

Using the above as input.. now generate the exact address for each pair in each column and load it..

type "CombineColumnPairList" in M1

type "Column#" in P1

type "pair#" in Q1

type "Gnerate-L-Addrs" in S1

type "Gnerate-M-Addrs" in V1

type "FinalLstWithDuplicate" in Y1

type "L" in Z1

type "M" in AA1

=IF(N1<SUM(H:H),N1+1,"") in N2 and drag until N60
=IF(N2="","",MATCH(N2,$J$2:$J$11,1)) in P2 and drag until P60
=IF(N2="","",IF(P2<>P1,1,Q1+1)) in Q2 and drag until Q60
=INDEX(C:C,MATCH(P2,B:B,0))&"K" in S2 and drag until S60
=13+Q2 in T2 and drag until T60
=INDEX(C:C,MATCH(P2,B:B,0))&"L" in V2 and drag until V60
=T2 in W2 and drag until W60
=INDIRECT(S2&T2,TRUE) in Z2 and drag until Z60
=INDIRECT(V2&W2) in AA2 and drag until AA60

Done with the full listing.. in column Z&AA


[[ Stage 3 ]]

Idea : from stage2 full list.. > use countif(), if 1, then the pair is unique > Use the "1" to generate another list, the unique pairs only.

  • type "[Stage 3] Find Unique" in AC1

    type "howmany unique?" in AG1

    type "FinalLstWithNoDuplicate" in AI1

    type "L" in AK1

    type "M" in AL1

Then :

=Z2&"-"&AA2 in AD2 and drag until AD30
=COUNTIF($AD$2:AD2,AD2) in AE2 and drag until AE30
=IF(AE2=1,AF1+1,AF1) in AF2 and drag until AF30
=COUNTIF(AE:AE,1) in AG2
=IF(AJ1<$AG$2,AJ1+1,"") in AJ2 and drag until AJ30
=IFERROR(INDEX(Z:Z,MATCH(AJ2,AF:AF,0)),"") in AK2 and drag until AK30
=IFERROR(INDEX(AA:AA,MATCH(AJ2,AF:AF,0)),"") in AL2 and drag until AL30

Column AK&AL should be ur desired resutls.. ( :

Note : Since you had get the logic of the formula/method.. then u know by now that depending on the input table size.. all the given formula are adjustable..

hope it helps.



来源:https://stackoverflow.com/questions/62311242/how-to-find-directional-roots-of-a-tree-using-excel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!