2012-04-12 43 views
4

我有一个Excel工作表,看起来像这样:如何递归追加单元格?

|A  B   C      D 
----------------------------------------------------------------------------------- 
1 |ID PARENTID VALUE     RESOLVED VALUE (how to generate this?) 
=================================================================================== 
2 |0  0   /root     /root 
3 |1  0   /one     /root/one 
4 |2  0   /two     /root/two 
5 |3  0   /three     /root/three 
6 |4  3   /child-one-of-three /root/three/child-one-of-three 
7 |5  3   /child-two-of-three /root/three/child-two-of-three 

每一行都有一个IDPARENTID。我想通过再次追加每行的VALUE来生成最后一列的内容RESOLVED VALUE

如何在Excel中执行此操作?

+0

ID = 1的'PARENTID'应该是0吗?否则,没有解析的值会追溯到'/ root'。 – Excellll 2012-04-12 13:40:49

+0

@Excellll你该死的。现在更正。 – adarshr 2012-04-12 13:41:33

+0

您是否打开VBA解决方案?我相当肯定,只有在知道树的最大深度时,才能使用内置的工作表函数来完成此操作。 – Excellll 2012-04-12 13:51:06

回答

3

假设你的数据开始在单元格A3:

=IF(B4=A4,C4,VLOOKUP(B4,$A$3:$D$5,4)&C4) 

你必须扩大$A$3:$D$5您的数据数组的大小。

+0

这是否足够动态以追加多个级别?我的意思是,它可以创建像'/ root/three/child/grandchild'这样的值吗? – adarshr 2012-04-12 14:13:30

+0

应该是。它采用父ID的完整路径(它以相同的方式构建),并将当前的“值”附加到它的末尾。请注意,您的记录应按“ID”排序以确保VLOOKUP正常运行。 – Marc 2012-04-12 14:15:29

+0

但我不明白如何在表达式中只有一个'&'。 – adarshr 2012-04-12 14:31:29

1

这是一个VBA功能解决方案。

Option Explicit 
Public Function ResValue(id As Long, table As Range, indexID As Integer, indexParentID As Integer, indexValue As Integer) As String 

Dim strTmp As String, idTmp As Long 
idTmp = id 
ResValue = "" 
Do While idTmp <> 0 
    strTmp = Application.WorksheetFunction.Index(table.Columns(indexValue), Application.WorksheetFunction.Match(idTmp, table.Columns(indexID), 0)) 
    ResValue = strTmp & ResValue 
    idTmp = Application.WorksheetFunction.Index(table.Columns(indexParentID), Application.WorksheetFunction.Match(strTmp, table.Columns(indexValue), 0)) 
Loop 
ResValue = Application.WorksheetFunction.Index(table.Columns(indexValue), Application.WorksheetFunction.Match(0, table.Columns(indexID), 0)) & ResValue 
End Function 

您可以在工作表中使用ResValue(id, table, indexID, indexParentID, indexValue)立即生成解析值。

注:

  • id是要生成的解决id的值。
  • table是整个表格的地址(不包括解析值列)。
  • 每个索引参数是每个字段的相对列索引。例如,ID是在表的第一列,因此indexID = 1,ParentIDs是在第二列,所以indexParentID = 2

在你的样表,你会在D3输入以下内容(的第一个单元的解决值):

=ResValue(A3,$A$3:$C$8,1,2,3) 

然后你可以填写这个公式的列下。

enter image description here

+0

感谢您的脚本。虽然它确实尝试做,但我发现它正在为第4,5行开始解析值,例如'/ root/one/two','/ root/one/two/three'等等。也就是说,它只是附加上一个值而不是考虑其父项。我可能做错了什么? – adarshr 2012-04-12 14:48:58

+0

查看我发布的屏幕截图。请注意,当您编辑原始帖子以显示1的ParentID为0(而不是1)时,它会更改后面所有ID的解析值。也许你只是急匆匆地看到一个不在那里的模式?我向你保证这个功能在我的机器上工作得很好。 – Excellll 2012-04-12 14:59:50

+0

哦的确如此。我的数据有误。我将编辑表格来反映这一点。感谢您提供了一个很好的解 – adarshr 2012-04-12 15:06:08