VBA - 条件Sum B列,直到A列中的值更改

时间:2017-11-11 12:49:22

标签: excel vba excel-vba

基本解释。我正在一个电子表格中收集所有多个发票数据。假设我只有两列分隔不同的发票:

Serial ID.    Value

ABC001        $5.00
ABC001        $5.00
ABC001        $5.00
CBA100        $6.00
CBA100        $4.00
CBA100        $5.00

我想要一个循环遍历列的VBA解决方案,在columnB中汇总值UNTIL在columnA中有一个变化,那么THEN会把这个和值放在columnC上的LAST ROW行之前。结果如下:

Serial ID.    Value   Total

ABC001        $5.00   
ABC001        $5.00
ABC001        $5.00   $15.00
CBA100        $6.00
CBA100        $4.00
CBA100        $5.00   $15.00

到目前为止,我发现最接近的是D Mason

的解决方案

但是他的代码中的问题是,columnB地址中值的总和是在EXACT行号WHERE THE CHANGE HAPPENS(不是BEFORE)中,它会像这样运行:

Serial ID.    Value   Total

ABC001        $5.00   $15.00   
ABC001        $5.00
ABC001        $5.00
CBA100        $6.00   $15.00
CBA100        $4.00
CBA100        $5.00

我确信,我明白了问题。但是为了以防万一,Serial Id将始终保持在同一列中,因此值也是如此。不会进行任何排序。如果整个范围的总和对我来说也不好,因为可能存在重复的发票,并且如果函数将采用范围(A:A)来查找条件序列号,则会产生错误的结果。提前谢谢你,如果有一些方法可以改进我的问题(如果我得到一个正确的答案,并希望它更容易找到有相同问题的其他人),写一个建议。

2 个答案:

答案 0 :(得分:2)

请试一试......

Sub GetTotal()
Dim rng As Range, cell As Range
Dim lr As Long
Dim Total As Double

Application.ScreenUpdating = False
lr = Cells(Rows.Count, 1).End(xlUp).Row
Set rng = Range("A2:A" & lr)
For Each cell In rng
    If cell = cell.Offset(1) Then
        Total = Total + cell.Offset(0, 1)
    Else
        Total = Total + cell.Offset(0, 1)
        cell.Offset(0, 2) = Total
        Total = 0
    End If
Next cell
Columns("C").NumberFormat = "$#,##0.00"
Application.ScreenUpdating = True
End Sub

答案 1 :(得分:0)

你可以试试下面的公式。

=IF(A2<>A1,SUMIF(A:A,A2,B:B),"")

按照屏幕截图所示放置公式C2单元格。

Screenshot