我正在 Windows 10 上运行 Excel 2013,内存为 16 GB。
我的层次结构类似于下面的图 1。我的结构有 1000 多行,深达 27 层。
对于如上所示的“树”,如何识别单元格的父单元?
这是我到目前为止所做的。使用条件格式和此公式:
=AND(A1<>"",OFFSET(A1,1,1)="")
Run Code Online (Sandbox Code Playgroud)
我能够识别树的叶节点,如下图 2 所示。
现在我需要找到树中每个单元格(子单元)的直接祖先(父单元)(第一行除外,没有父单元)。
图 3(下)显示了手动完成的示例:
此外,我可以将树与轮廓相关联。然后我可以计算大纲中的小数位数,以便使用以下公式跟踪级别变化:
=LEN(A2)-LEN(SUBSTITUTE(A2,".",""))
Run Code Online (Sandbox Code Playgroud)
如下图4所示:
如何以编程方式完成图 3 中手动完成的工作?
对于每一行(记录在树外部的列中),打印作为该单元格的父单元格的位置。
这是一个类似的问题,手动提供“级别”信息。
就我而言,我需要根据大纲(如图所示)或使用条件格式的公式进行工作。
根据您的规则,单元格的父单元格是紧邻左侧的列中从下到上的第一个非空单元格:
public function GetParentCell(byval c as range) as range
set GetParentCell = c.offset(0,-1).end(xlUp)
end function
Run Code Online (Sandbox Code Playgroud)
将其放入模块后,您可以从工作表中使用它,例如
=CELL("address", GetParentCell(D4))
Run Code Online (Sandbox Code Playgroud)
显示 的父级的地址D4。
如果您想完全避免 VBA,则必须找到一种方法来转换End(xlUp)为公式,这可能会很困难,因为 Excel 查找是从上到下进行的,而您想要相反的方式。如果我要这样做,我将从列中的最后一个非空单元格开始。
鉴于层次结构包含在A1:G19:
输入H1:
=MATCH("x",$A1:$G1,0)
Run Code Online (Sandbox Code Playgroud)输入I1
=CELL("address",INDEX(INDEX($A$1:$G$19,1,H1-1):INDEX($A$1:$G$19,ROW(),H1-1),MAX((INDEX($A$1:$G$19,1,H1-1):INDEX($A$1:$G$19,ROW(),H1-1)<>"")*(ROW(INDEX($A$1:$G$19,1,H1-1):INDEX($A$1:$G$19,ROW(),H1-1))))))
Run Code Online (Sandbox Code Playgroud)
作为数组公式 ( CTRL++ Shift) Enter。
功劳归于/sf/answers/381006881/因为它只不过是=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A)))).
把所有东西都拖下来。
列中的公式I返回每个单元格的父级作为真实引用,然后由函数检查CELL()以显示地址。您可以删除CELL()并以不同的方式使用计算的参考。