【问题标题】:How to find parent in an indented hierarchy?如何在缩进层次结构中找到父级?
【发布时间】:2016-01-12 21:07:36
【问题描述】:

我目前在 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。
提前感谢您的帮助。

【问题讨论】:

  • 澄清一下,解决方案不一定是 VBA。事实上,如果不这样做会更好。
  • reverse match 可能会有所帮助。这样,您将获得行号,可以在索引公式中使用它来获得所需的结果。给我一分钟...

标签: excel vba


【解决方案1】:

好的,假设上表从单元格 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 所做的。

【讨论】:

  • 非常感谢您的解决方案和详尽的解释!
【解决方案2】:

我花了一段时间才明白这个公式是如何工作的,所以在弄清楚之后(好吧,我妻子帮了我一点忙),我想为像我这样的其他 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)。 (最大)

  4. 返回X范围内行号$A$1:$A$7中的值

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多