如何在缩进的层次结构中查找父级?

时间:2016-01-12 21:07:37

标签: excel vba

我目前在excel中有一个带有缩进的项目层次结构的工作表,如下所示。
每个项目都缩进(每个缩进四个空格)以显示它如何适合整个层次结构。
我能够创建一个“级别”列,将缩进级别转换为数字。

    +------------+-------+--------+
    |    Item    | Level | Parent |
    +------------+-------+--------+
    | P1         |     1 | N/A    |
    |     P2     |     2 | P1     |
    |     P3     |     2 | P1     |
    |         P4 |     3 | P3     |
    |     P5     |     2 | P1     |
    |         P6 |     3 | P5     |
    +------------+-------+--------+

我想要做的是生成上面的“父级”列,它使用“级别”信息来显示每个项目的父级。
我认为这需要通过一个可以执行此操作的循环来完成对于每个项目X:

    -Find level info for X
    -Find (levelx-1) which would equal the parent item's level
    -Search upward for the first row with a level equal to (levelx-1)
    -Find the item number in that row
    -Write item number in adjacent cell to X

不幸的是,我不确定如何将这个想法转化为VBA。
提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

好的,假设上面的表格在单元格A1中开始,有用的数据从第2行开始。这个公式可以解决这个问题:

=INDEX($A$1:$A$7,MAX(IF($B$2:$B2=B2-1,ROW($B$2:$B2),"")))

在单元格C2中以阵列公式(Ctrl + Shift + Enter)输入,然后将其拉下。第一个显然是错误(不是#NA而是#VALUE)。

工作原理:

IF($B$2:$B2=B2-1,ROW($B$2:$B2),"")

这将创建一个数组,其中行的编号比实际值低一个级别。要仅检查当前行的 值,您需要使用扩展范围,因此需要$B$2:$B2样式引用。

MAX函数获取这些行的最大值,这是最接近当前单元格的行。现在我们有行号。我们现在需要的是从指定行中从列A中提取数据的公式。这就是INDEX的作用。

答案 1 :(得分:0)

我花了一段时间才明白这个公式是如何工作的,所以在搞清楚之后(好吧,我的妻子帮了我一点)我想和其他像我这样的Excel假人分享一个白痴的解释。我们走了:

=INDEX($A$1:$A$7,MAX(IF($B$2:$B2=B2-1,ROW($B$2:$B2),"")))

表示:

  1. 在范围$B$2:$B2中的值中找到所有等于的值 B2-1
  2. 如果找到它们,请列出值等于的行号 B2-1。 (行)
  3. 从行号列表中选择最高号 行号(我们称之为号码X)。 (MAX)
  4. 返回X

    范围内行号$A$1:$A$7中的值

    (警告!您的范围必须从第1行开始,因此行号与您范围内的行号相同。否则 - 您必须调整公式。)