示例文件: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 ...),看看我是否可以提出一些建议,没有运气。
有人有建议/链接,甚至更好的解决方法吗?
非常感谢。
答案 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