我目前在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。
提前感谢您的帮助。
答案 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),"")))
表示:
$B$2:$B2
中的值中找到所有等于的值
B2-1
。 B2-1
。 (行)X
)。 (MAX)返回X
$A$1:$A$7
中的值
(警告!您的范围必须从第1行开始,因此行号与您范围内的行号相同。否则 - 您必须调整公式。)