如何使用 Excel 查找树的方向根?

How to find directional roots of a tree using Excel?

我有以下问题。感谢您的帮助

有一棵树,有向根从下到上。 如何使用 Excel 找到所有连接(成对)?

例如对于列E->对于child12; 12-9、12-6、12-3 和 12-1,用于 child 9; 9-6、9-3 和 9-1,为 child 6; 6-3和6-1,对于child3,3-1是连线。

L2和M2写什么抄下来? (它不应该有空白或重复连接)

感谢您的帮助。

大图:第 1 阶段:列出每一列的所有可能对 | Stage2:组合成对并删除重复项 |阶段 3:将结果放入所需格式(L & M 列表..)

[[第 1 阶段]]

想法:加载原始列表[A] > 为 L & M 生成索引号 [B] > 使用索引号加载 L & M 值 [C]

假设数据完全按照 table1 中的 Sheet 定位。在 Sheet2..

中完成所有这些

[创建模板]

  • 在 A1

    中输入 "choose"

    在 D1

    中输入 "list :"

    在 A7

    中输入 "how many item :"

    在 A9 中输入 "how many possible pairs :"

输入:

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

table E1 是 "load the original list" [A] 部分。

然后:

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

现在,开始第 [B] 部分:"generate index# for L & M"

然后:

  • 在 A11

    中输入 "generate list"

    在 A13 中输入“#”

    在 A13 中输入 1

    在 K13

    中键入 "L"

    在 L13

  • 中输入 "M"

输入这些公式:

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

然后:

=D7 in C13
=C13-1 in C14

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

然后 :

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

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

[B] 部分结束,"generating the index#"。

最后..

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

列 I&E 是 [C] 部分,"load L & M value using index#"。 其中 K&L 列是 'cleaned' 版本

完成创建模板..为了更好的理解..做这些..

  • 在 C26

    中输入 "use " 要生成多少项“值 "index #"”

    在 K26

    中键入 "sort the output list as per wanted format"

    在 D27

    中输入 "generate index #"

    在 E28

    中输入 "get L value from list using index #"

    在 G30

    中输入 "get item count from value list"

    在 H31

    中键入 "use "要生成 "index #" 的项目计数“值”

    在 I32 中输入 "get M value from list using index #"

[使用模板]

要使用,在单元格B1中输入1-10的列号,结果在K13中table..

[备注]

这是为 1 列生成对列表。您可以通过在 sheet3 中执行相同的操作来将其扩展到另一列。将 sheet3 中的 B1(select 列)值更改为 see/manipulate K13 table.

中的 result/list

一直做到完成&试着理解公式的每一部分..,问你是否卡住了/(^_^)

一些参考:

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

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


[[第 2 阶段]]

想法:为每个生成地址 sheet > 使用 indirect() 加载列表作为组合列表

步骤:将以上内容复制到 sheet3 并选择第 2 列(Sheet2 中的第 1 列).. 然后重复.. Sheet4 > 第 5.. Sheet6 > 第 5 列 .. 直到 Sheet10.. 现在创建 Sheet11 并执行这些操作..

  • 在 A1

    中输入 "Sheet[x]"

    在 A2 中输入“2”

    在 B1

    中输入 "Column#"

    在 B2 中输入“1”

    在 C1

    中输入 "SheetAddrs"

    在 E1

    中输入 "AddrsOfColmnK"

    在 F1

    中输入 "AddrsOfColmnK"

    在 H1

    中输入 "how many pairs listed per column"

    在 J1

    中输入 "from"

    在 J2 中输入“1”

    在 K1 中输入 "to"

然后:

=A3中的A2+1一直拖到A10 =B2+1 在 B3 中拖动直到 B10 ="Sheet"&A2&"!"在 C2 中拖动直到 C10 =C2&"K:K" 在 E2 中拖动直到 E10 =C2&"L:L" 在 F2 中拖动直到 F10 =COUNT(INDIRECT(E2,TRUE)) 在 H2 中拖动直到 H10 =J2+H2-1 在K2 拖到K10 =K2+1 在 J3 中拖动直到 J10

使用上面的作为输入..现在为每一列中的每一对生成准确的地址并加载它..

在 M1

中输入 "CombineColumnPairList"

在 P1

中输入 "Column#"

在 Q1 中输入 "pair#"

在 S1

中输入 "Gnerate-L-Addrs"

在 V1

中输入 "Gnerate-M-Addrs"

在 Y1

中输入 "FinalLstWithDuplicate"

在 Z1

中输入 "L"

在 AA1

中输入 "M"
=IF(N1<SUM(H:H),N1+1,"") in N2 and drag until N60
=IF(N2="","",MATCH(N2,$J:$J,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

在 Z&AA 列中完成完整列表..


[[第 3 阶段]]

想法:来自 stage2 完整列表.. > 使用 countif(),如果为 1,则该对是唯一的 > 使用“1”生成另一个列表,仅唯一对。

  • 在 AC1

    中输入“[第 3 阶段] 查找唯一”

    在 AG1

    中输入 "howmany unique?"

    在 AI1

    中输入 "FinalLstWithNoDuplicate"

    在 AK1

    中输入 "L"

    在 AL1 中输入 "M"

然后:

=Z2&"-"&AA2 in AD2 and drag until AD30
=COUNTIF($AD: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,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

AK&AL 列应该是您想要的结果..(:

注意:既然你已经得到了 formula/method 的逻辑..那么你现在知道根据输入 table 大小..所有给定的公式都是 adjustable..

希望对您有所帮助。