基于 parent child 层次结构的分组项目分类

classification of grouped items based on parent child hierarchy

我有几千行 parent-child 层次结构和我在这里分享的示例。数据具有从 0 到 10 的层次结构级别,但对我来说,3 级及以上的级别很重要,因为我正在计算 parent 级别 3 的权重,这取决于它的 child 和 sub child 级别。

从L列到P列,我已经显示了层次结构,其中3是parent,4是child,然后一些childs 4被分类到5,6 ,7...等等。 parent 3 的权重是所有 4 的总和,其中 4 的总和又是 5 的总和,依此类推..

我最初尝试写 parent 信息。每个 child 通过在 C7 中输入以下公式 =IF(B7>3;IF(B7>B6;D6;C6);"")

它在第 6 行之前工作正常,然后随着这里的级别从 6 变为 5 而失败。请参见下图

所以我意识到 Excel 公式在这里不足以提取所有 parent 信息。此外,单元格 F6 再次基于 material 分类,再次依赖于 child.

谁能告诉我如何继续 vba 提取 parent 信息。和重量分类?几行代码对我起步很有帮助。

非常感谢!

请测试下一个代码。您没有回答我的澄清问题,以下代码假定您没有向我们显示第二个 5:

的正确权重
Sub CalculateWeight()
   Dim sh As Worksheet, lastR As Long, arr, arrC, ref As Long, i As Long, j As Long, k As Long

   Set sh = ActiveSheet
   lastR = sh.Range("B" & sh.rows.count).End(xlUp).row
   arr = sh.Range("B3:D" & lastR).Value 'put the range to be processed in an array, for faster iterations
   ReDim arrC(1 To UBound(arr), 1 To 1) 'redim the final array for the same number of rows like arr

   For i = 1 To UBound(arr)             'iterate between the array rows
        If arr(i, 1) > 3 Then           'if the hierarchy value is > 3:
            Do While (arr(i + j, 1) > 3)'loop until the next 0
                ref = i - 1             'memorize the row keeping the third hierarchy
                If arr(i + j, 1) = arr(i + j - 1, 1) + 1 Then      'if the value in column 1 is less with a unit thay precedent
                     arrC(i + j, 1) = arr(i + j - 1, 3): j = j + 1 'take the value of the precedent row, third column
                Else
                    For k = i + j To ref Step -1                   'iterate backwards
                        If arr(i + j, 1) = arr(k - 1, 1) + 1 Then  'when find the hierarchy less with a unit
                            arrC(i + j, 1) = arr(k - 1, 3): j = j + 1: Exit For 'take the value of third column and exit iteration
                        End If
                    Next k
                    
                End If
                If i + j > UBound(arr) Then Exit For  'exit iteration if it exceeds the array number of elements
            Loop
        Else
            arrC(i, 1) = ""                            'for lines before each 3
        End If
        If j > 0 Then i = i + j - 1: j = 0  'reinitialize variables
   Next i
   sh.Range("C3").Resize(UBound(arrC), 1).Value = arrC 'drop the array content at once
End Sub