【问题标题】:Using Excel, how to find parent cell in a hierarchy?使用 Excel,如何在层次结构中查找父单元格?
【发布时间】:2017-05-15 22:20:14
【问题描述】:

我在 16 GB 内存的 Windows 10 上运行 Excel 2013。

我有一个类似于下图 1 的层次结构。我的结构有 1000 多行,深达 27 层。

对于上图的“树”,如何识别单元格的父节点?

这是我到目前为止所做的。使用条件格式,以及这个公式:

  =AND(A1<>"",OFFSET(A1,1,1)="")

我能够识别树的叶子节点,如下图2所示。

现在我需要找到树中每个单元(子)的直接祖先(父)(除了没有父的第一行)。

图 3(下)显示了一个手动完成的示例:

此外,我可以将树与轮廓相关联。 然后我可以计算大纲中的小数位数,以便使用以下公式跟踪级别变化:

  =LEN(A2)-LEN(SUBSTITUTE(A2,".",""))

如下图4所示:

如何以编程方式完成图 3 中手动完成的工作?

对于每一行(记录在树外的一列中),打印作为单元格父级的单元格的位置。

这是一个手动提供“级别”信息的类似问题。

How to find parent in an indented hierarchy?

就我而言,我需要使用大纲(如图所示)或使用条件格式的公式。

【问题讨论】:

  • 给定一个cell,它的父级是cell.offset(0,-1).end(xlUp)
  • 您会在建议的答案中展示您的解决方案吗?我不确定如何将您的评论应用于我的样本?我应该将示例放在 Google 电子表格上并分享网址吗?
  • 这是一个 VBA 表达式,它返回给定单元格的父级。我不确定如何将End(xlUp) 翻译成公式,它可能会涉及一个复杂、令人困惑且缓慢的构造。如果您对某些 VBA 感到满意,请创建一个接受 c 并返回 c.offset(0,-1).end(xlUp) 的函数并从工作表中使用它,否则它可能对您没有帮助。
  • 听起来很有希望。我曾希望避免使用 VBA,因为我不是 VBA 程序员,但如果它有效,我会接受它。您会发布脚本以便我可以复制/粘贴到 VBA 编辑器中并尝试一下吗?我希望这些值出现在自己的列中,在层次结构的左侧或右侧。
  • 我已经发布了公式。

标签: excel


【解决方案1】:

根据您的规则,单元格的父级是第一个非空单元格,从下到上,在紧靠左侧的列中:

public function GetParentCell(byval c as range) as range
  set GetParentCell = c.offset(0,-1).end(xlUp)
end function

将其放入模块后,您可以从工作表中使用它,例如

=CELL("address", GetParentCell(D4))

显示D4的父地址。

如果您想完全避免使用 VBA,您必须找到一种方法将 End(xlUp) 转换为可能证明很困难的公式,因为 Excel 查找 work from top to bottom 而您希望反过来。如果我要这样做,我会从Last non-empty cell in a column开始。

鉴于层次结构包含在A1:G19

  • H1,输入:

    =MATCH("x",$A1:$G1,0)
    
  • 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))))))
    

    作为数组公式(CTRL+Shift+Enter)。

    功劳归于https://stackoverflow.com/a/5442955/11683,因为它只不过是=INDEX(A:A,MAX((A:A&lt;&gt;"")*(ROW(A:A)))) 的动态版本。

  • 将所有内容向下拖动。

I 列中的公式将每个单元格的父单元返回为真正的引用,然后由 CELL() 函数检查以显示地址。您可以删除 CELL() 并以不同的方式使用计算的引用。

【讨论】:

  • 我这样做是否正确。 H 列工作正常。 I 列返回正确的列。但该行的值始终为 1 美元。例如,H12 为 7(G 列)。但是 I12 是 $F$1,而它应该是 $F$11。同样,H4 为 4(正确)。但是 I4 是 $C$1 但应该是 $C$3。我做错了什么?
  • 您错过了“作为数组公式 (CTRL+Shift+Enter)”,不是吗。
猜你喜欢
  • 2013-01-21
  • 2016-12-16
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 2020-06-11
  • 2012-08-04
相关资源
最近更新 更多