Excel-汇总嵌套级别

时间:2019-09-04 22:07:29

标签: excel vba excel-formula

示例文件:https://app.box.com/shared/static/iqfjj51hmusu6uk0exwjfnwkjdlwhezr.xlsx

我有一些产品是由许多组件制成的。 在上面的示例中,我的主要产品由n 5个2级组件组成,其中某些2级组件又由许多3级组件组成,依此类推。

其中每个都有固定价格(B列)。

现在,问题是:我需要计算每个级别+子级别的总和。在示例中,这是手动完成的,因此让我们看一下C3,您可以看到它是Level 2本身加上制造它所需的所有Level 3组件的总和。 C8也是如此:相应的3级组件由n2 4级组件组成。希望这个例子足够清楚。

这在手动完成时非常容易,但是我需要在C列中使用一个公式为我选择正确的单元格(基于A列的值),因为范围是动态的,这意味着我可以有很多子层次如我所愿,行数从未固定:现在,级别3变为A4:A8,但很可能是A4:A6,A7:A30,您可以理解要点。

我真的很困,我不知道如何在VBA中做到这一点,我尝试了一些公式(偏移量+ if,match,index ...),看看我是否可以提出一些建议,没有运气。

有人有建议/链接,甚至更好的解决方法吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

喜欢这种VBA用户定义的单元格公式吗? 在C2单元格中使用单元格公式=sumSubLevels(A2),在C3单元格中使用=sumSubLevels(A3),依此类推。此示例添加了当前级别+所有递归子级别。这是一个简单的BOM表。

Option Explicit

Public Function sumSubLevels(rSource As Range) As Double
    Dim iLevel As Long, iSubLevel As Long, iRow As Long
    Dim dSum As Double

    iLevel = rSource.Value
    iRow = 0
    dSum = rSource.Offset(0, 1)
    Do While (True)
        iRow = iRow + 1
        If rSource.Offset(iRow, 0) = "" Then Exit Do
        iSubLevel = rSource.Offset(iRow, 0)
        If iSubLevel > iLevel Then
            dSum = dSum + rSource.Offset(iRow, 1)
        ElseIf iSubLevel <= iLevel Then
            Exit Do
        End If
    Loop
    sumSubLevels = dSum
End Function