如何find父缩进层次?
我目前有一个excel表格,其缩进层次如下所示。
每个项目都缩进(每个缩进四个空格)以显示它如何适合整个层次结构。
我已经能够创build一个“级别”列,将缩进级别转换为数字。
+------------+-------+--------+ | 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
中input数组公式(Ctrl + Shift + Enter),然后将其拉下。 第一个显然是一个错误(不#NA
但#VALUE
)。
怎么运行的:
IF($B$2:$B2=B2-1,ROW($B$2:$B2),"")
这会创build一个数组的行号,其值比实际值低一级。 要仅检查当前行上面的值,需要使用扩展范围,因此需要$B$2:$B2
样式引用。
MAX
函数获得这些行的最大值,这是最接近我们当前的单元格。 现在我们有行号。 我们现在需要的是一个公式从指定的行中提取列A
的数据。 这是INDEX
所做的。
我花了一段时间才明白这个公式是如何工作的,所以在弄清楚了之后(我的妻子帮了我一些忙),我想分享一个像我这样的其他Excel傻瓜的白痴解释。 开始了:
=INDEX($A$1:$A$7,MAX(IF($B$2:$B2=B2-1,ROW($B$2:$B2),"")))
手段:
- 范围
$B$2:$B2
值可以find所有等于B2-1
值。 - 如果find它们,请列出等于
B2-1
的行号。 (行) - 从行号列表中挑选最高的行号(称为号码
X
)。 (MAX) -
返回
$A$1:$A$7
范围内的行号X
中的值(警告!你的范围必须从第一行开始,这样行号和你范围内的行号相同,否则你必须修改公式。)