我目前有一个 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。
提前感谢您的帮助。
最佳答案
好的,假设上表从单元格 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
的作用。
关于excel - 如何在缩进层次结构中找到父级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34753817/