2016-08-02 57 views
0

我有一個包含事務列表和每個事務的可變數量行的工作表。我正在使用下面的代碼按交易總和線路金額。一列中的VBA總和範圍直到另一列中的非空行爲止

列A是事務報頭(事務之間的空白單元格) 列H是交易行量 E欄是我想要總交易

因此,如果列A <>「」然後開始添加列H,直到列A再次爲<>「」。

該代碼除了最後一個事務處理完美。如果它的行數超過兩行,則只會累加第一行和最後一行的數量。我無法弄清楚爲什麼。

任何想法?

Here's a screenshot of my workbook

Option Explicit 
Option Base 1 

Sub SumColumnH() 

Dim dSum As Double 
Dim li As Long 
Dim lj As Long 
Dim lN As Long 
Dim alRowFormula() As Long 
Dim rng As Range 

'Clear column 5 
    Intersect(Columns(5), Range(Rows(6), Rows(Rows.Count))).ClearContents 

'Get row Index where to write formulas 
    For Each rng In Intersect(Columns(1), Range(Rows(6), Rows(Rows.Count))) _ 
    .Cells.SpecialCells(xlCellTypeConstants) 
     lN = lN + 1 
     ReDim Preserve alRowFormula(lN) 
     alRowFormula(lN) = rng.Row 
    Next rng 

'Sum rows 
    For li = 1 To lN - 1 
     dSum = 0 
     For lj = alRowFormula(li) To alRowFormula(li + 1) - 1 
      dSum = dSum + Cells(lj, 8).Value 
     Next lj 
     Cells(alRowFormula(li), 5).Value = dSum 
    Next li 

'Final sum row 
    Cells(alRowFormula(lN), 5).Value = WorksheetFunction _ 
    .Sum(Cells(alRowFormula(lN), 8), Cells(alRowFormula(lN), 8).End(xlDown)) 

End Sub 
+0

不知道使用.SUM函數計算,但它看起來像您保持在循環 –

回答

0

你最終.SUM只是增加了兩個單元:Cells(alRowFormula(lN), 8)Cells(alRowFormula(lN), 8).End(xlDown)

你真正想要

Cells(alRowFormula(lN), 5).Value = WorksheetFunction _ 
.Sum(Range(Cells(alRowFormula(lN), 8), Cells(alRowFormula(lN), 8).End(xlDown))) 

附:您的其他數值也可以通過使用下面的代碼

'Sum rows 
    For li = 1 To lN - 1 
     Cells(alRowFormula(li), 5).Value = WorksheetFunction _ 
     .Sum(Range(Cells(alRowFormula(li), 8), Cells(alRowFormula(li + 1)-1, 8))) 
    Next li 
+0

這工作復位和回0!非常感謝你的幫助。順便說一句,你提到的不同求和方法有什麼優勢?只是使用與最終求和線相同的方法更清潔? – phelbin

+0

@phelbin - 就我個人而言,我會使用你原來的方式(儘管我可能會在alRowFormula中指向最後一行之後的行添加一個額外的條目 - 從而避免對最後一個事務頭進行單獨處理),但我只是我認爲我會建議使用.Sum作爲初始記錄,以便您的代碼「一致」。 – YowE3K

相關問題