【问题标题】:Transform Hierarchy Tree into Parent/Child Table with Excel Formulas使用 Excel 公式将层次结构树转换为父/子表
【发布时间】:2021-09-17 15:16:56
【问题描述】:

我正在尝试将具有 5 个级别的层次结构转换为具有 2 列的父/子表。

我需要使用 Excel 公式而不是 VBA 脚本来执行此操作。我可以用Index 和Match 函数来做到这一点吗?

父/子表应该是动态的,并在层次结构发生变化时自动更新。

A B C D E
1 H I E R A R C H Y
2 Universe
3 North America
4 USA
5 California
6 San Francisco
7 Los Angeles
8 Montana
9 Mexico
10 Canada
11 Europe
12 Italy
13 Spain
France

我能够使用下面的数组公式填充儿童,即 B2 中的北美:

{=INDEX(A3:E3,MATCH(FALSE,ISBLANK(A3:E3),0))}

但是我正在寻找一个公式来填充父母。

预期的父/子表:

A B
1 Parent Child
2 Universe North America
3 North America USA
4 USA California
5 California San Francisco
6 California Los Angeles
7 USA Montana
8 North America Mexico
9 North America Canada
10 Universe Europe
11 Europe Italy
12 Europe Spain
13 Europe France

【问题讨论】:

    标签: excel-formula parent-child hierarchy


    【解决方案1】:

    我认为适用于孩子的INDEX 和MATCH 方法不适用于父母,因为:

    • 您的数据结构意味着每行只有一条信息,因此{=INDEX(A3:E3,MATCH(FALSE,ISBLANK(A3:E3),0))} 始终适用于子值

    • 但是,该子值的父值是 prior 列中的值,而 未知行数 子行。所以,因为INDEX/MATCH 方法没有返回子节点的位置,以便我们可以找出需要识别和处理的prior列等。

    我们可以认为父值位于该列的行中,非空值的最大索引一直到该行并包括该行。

    例如对于西班牙,检查父级的范围是:

    例如对于洛杉矶,检查父级的范围是:

    因此,要建立正确的范围来检查子项的父值,您需要偏移 -1 列并从最小行 (2) 到最大行(子项的行)。

    为此,我们需要得到:

    1. 孩子的行/列坐标(因此我们也可以知道孩子的值)
    2. 前一列的最小和最大行(父列必须存在于该列的非空值中)
    3. 通过INDIRECT(ADDRESS(...)) 方法针对行/列索引解析值

    所以它最终会是这样的:

    地点:

    儿童地址

    • C_row: =ROW(A2:E2) 只是层次结构的行
    • C_col:=SUMPRODUCT(--NOT(ISBLANK(A2:E2)),COLUMN(A2:E2)) 是公式的非数组公式版本,它返回非空白单元格的索引而不是值本身
    • C_add: =ADDRESS(G2,H2) 是上面C_row 和C_col 的子值的地址

    父母地址

    • P_col:=H2-1 是子列 (C_col) 的 prior 列;我们知道有父值
    • P_add_min:=IF(J2>0,ADDRESS(2,J2),"zzz") 是包含父级的范围的最小行的地址,具有标识层次结构根的条件(即Universe 没有父级)
    • P_add_max:=IF(J2>0,ADDRESS(G2,J2),"zzz")是包含父级的范围的最大行的地址,条件与P_add_min相同的层次结构的根
    • P_row: =IF(J2>0,AGGREGATE(14,4,(NOT(ISBLANK(INDIRECT(K2&":"&L2)))*ROW(INDIRECT(K2&":"&L2))),1),"zzz") 表示子节点不是层次结构的根,获取子节点 prior 列中非空值的LARGEst 索引和上面建立的最大行数

    预期输出

    • Parent:=IF(J2>0,INDIRECT(ADDRESS(M2,J2)),"zzz")获取P_row和P_col给出的地址处的值
    • child:=INDIRECT(I2)获取C_add给出的地址处的值

    可扩展性

    上述方法考虑了任意数量的组件的层次结构,其中层次结构的最大深度为 5(例如,列 E 中的叶子)。

    如果您还想拥有任意深度,那么您需要将辅助列和输出列分隔到不同的工作表中,例如

    • C_row:=ROW(Sheet1!2:2)
    • C_col:=SUMPRODUCT(--NOT(ISBLANK(Sheet1!2:2)),COLUMN(Sheet1!2:2))
    • C_add:=ADDRESS(A2,B2,1,1,"Sheet1")
    • P_col:=B2-1
    • P_add_min:=IF(D2>0,ADDRESS(2,D2),"zzz")
    • P_add_max:=IF(D2>0,ADDRESS(A2,D2),"zzz")
    • P_row:=IF(D2>0,AGGREGATE(14,4,(NOT(ISBLANK(INDIRECT("Sheet1!"&E2&":"&F2)))*ROW(INDIRECT("Sheet1!"&E2&":"&F2))),1),"zzz")
    • 家长:=IF(D2>0,INDIRECT(ADDRESS(G2,D2,1,1,"Sheet1")),"zzz")
    • 孩子:=INDIRECT(C2)

    您可以继续将zzz 重命名为"" 以进行整理。

    HTH

    【讨论】:

      猜你喜欢
      • 2022-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 2018-02-06
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多