使用VBA的特定小计

时间:2019-02-08 13:53:21

标签: excel vba subtotal

enter image description here

以上是我从数据库中提取的输入数据的示例。列A具有多个级别(命名为L1,L2,L3,L4,L5)。 B列具有值。它的运作方式是 L2 =上面所有L1的总和,直到遇到上面的另一个L2。 L3 =上面所有L2的总和,直到遇到上面的另一个L3。

与L4类似。最终级别是L5,它具有该列中所有L4的总和。

此外,有时会有一个独立的L2(没有可用的L1分手详细信息),因此必须按原样考虑。示例–单元格B10的独立值为2,并且在单元格B9中紧随其后的是另一个L2,它是其上方L1的总和

问题是有时数据不正确,L2可能不是其上所有L1的总和(就像数据库可能遗漏了L1行)。我需要在C列中验证是否发生了此类错误。

因此,如果没有错误,则C列中的输出应与L2,L3,L4,L5的列B相同。或使用其他值(如果有错误)。

该范围是动态的,可运行数百行。

任何宏或预先存在的excel公式都可以做到这一点?

对于能为该问题提供的任何帮助/代码或指针,我将不胜感激。

以下是我创建的零件代码。在评论部分需要您的帮助。谢谢您的协助。

Sub Ttals()
lastrow = Worksheets("EMEA").Cells(Rows.Count, "AB").End(xlUp).Row
Debug.Print lastrow
For i = 2 To lastrow
If Cells(i, 1) = "L1" Then
    Cells(i, 3) = Cells(i, 2) 'This is pasting L1 values from column B/2 to column C/3

ElseIf Cells(i, 1) = "L2" Then
'Insert a function to search rows above this cell for values:
'If immediately above - L2/L3/L4/L5/L6 are encountered, paste value from column B/2 for this row
'If immediately above L1 is encountered, keep going above till more L1 are encoutered,
'and when any other L are encountered, stop going up and take a sum of all L1 in this range and post the sum

ElseIf Cells(i, 1) = "L3" Then
'Insert similar function which I can modify myself once I get the above function for L2

End If
Next
End Sub

1 个答案:

答案 0 :(得分:1)

以下是您可以使用的公式:

{=IF(VALUE(RIGHT(A1,1))>1,IF(COUNTIFS(INDIRECT("A1:A"&ROW()),A1)=1,SUMIFS(INDIRECT("B1:B"&ROW()),INDIRECT("A1:A"&ROW()),"L"&VALUE(RIGHT(A1,1))-1),SUMIFS(INDIRECT("B"&LARGE(IF($A$1:INDIRECT("A"&ROW())=A1,ROW($A$1:INDIRECT("A"&ROW()))-MIN(ROW($A$1:INDIRECT("A"&ROW())))+1),2)&":B"&ROW()),INDIRECT("A"&LARGE(IF($A$1:INDIRECT("A"&ROW())=A1,ROW($A$1:INDIRECT("A"&ROW()))-MIN(ROW($A$1:INDIRECT("A"&ROW())))+1),2)&":A"&ROW()),"L"&VALUE(RIGHT(A1,1))-1)),B1)}

尝试了其他方法来检查上面的行的值,但是数组公式对我来说更好,所以下面是对0的检查:

{=IF(IF(VALUE(RIGHT(A1,1))>1,IF(COUNTIFS(INDIRECT("A1:A"&ROW()),A1)=1,SUMIFS(INDIRECT("B1:B"&ROW()),INDIRECT("A1:A"&ROW()),"L"&VALUE(RIGHT(A1,1))-1),SUMIFS(INDIRECT("B"&LARGE(IF($A$1:INDIRECT("A"&ROW())=A1,ROW($A$1:INDIRECT("A"&ROW()))-MIN(ROW($A$1:INDIRECT("A"&ROW())))+1),2)&":B"&ROW()),INDIRECT("A"&LARGE(IF($A$1:INDIRECT("A"&ROW())=A1,ROW($A$1:INDIRECT("A"&ROW()))-MIN(ROW($A$1:INDIRECT("A"&ROW())))+1),2)&":A"&ROW()),"L"&VALUE(RIGHT(A1,1))-1)),B1)=0,B1,IF(VALUE(RIGHT(A1,1))>1,IF(COUNTIFS(INDIRECT("A1:A"&ROW()),A1)=1,SUMIFS(INDIRECT("B1:B"&ROW()),INDIRECT("A1:A"&ROW()),"L"&VALUE(RIGHT(A1,1))-1),SUMIFS(INDIRECT("B"&LARGE(IF($A$1:INDIRECT("A"&ROW())=A1,ROW($A$1:INDIRECT("A"&ROW()))-MIN(ROW($A$1:INDIRECT("A"&ROW())))+1),2)&":B"&ROW()),INDIRECT("A"&LARGE(IF($A$1:INDIRECT("A"&ROW())=A1,ROW($A$1:INDIRECT("A"&ROW()))-MIN(ROW($A$1:INDIRECT("A"&ROW())))+1),2)&":A"&ROW()),"L"&VALUE(RIGHT(A1,1))-1)),B1)}

请注意,这是一个数组公式!粘贴到cel C1中,然后将其向下拖动。

相当长的一个:P