2016-08-02 13 views
0

Ich habe ein Arbeitsblatt mit einer Liste von Transaktionen und einer variablen Anzahl von Zeilen pro Transaktion. Und ich verwende den folgenden Code, um die Zeilenbeträge nach Transaktion zu summieren.VBA Summe Bereich in einer Spalte bis nicht leere Zeile in einer anderen Spalte

Spalte A ist der Vorgangskopf (leere Zellen zwischen Transaktionen) Spalte H ist die Transaktionszeile beträgt Spalte E ist, wo ich die Transaktion

insgesamt will

Also, wenn Spalte A <> „“ starten Sie dann Spalte hinzufügen H bis Spalte A wieder <> "" ist.

Der Code funktioniert perfekt mit Ausnahme der letzten Transaktion. Wenn es mehr als zwei Zeilen hat, addiert es nur den ersten und letzten Zeilenbetrag. Und ich kann nicht herausfinden warum.

Irgendwelche Ideen?

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

nicht sicher, aber es sieht aus wie Sie die Summe zurück in der Schleife auf 0 halten Zurücksetzen –

Antwort

0

Ihre letzte .sum ist das Hinzufügen von nur zwei Zellen: Cells(alRowFormula(lN), 8) und Cells(alRowFormula(lN), 8).End(xlDown).

Sie wollen eigentlich

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

P. S. Ihre andere Werte auch mit dem folgenden Code, um die .sum-Funktion berechnet werden konnte

'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

Das hat geklappt! Vielen Dank für deine Hilfe. Und BTW, was ist der Vorteil mit der anderen Summierungsmethode, die Sie erwähnt haben? Ist es nur sauberer, die gleiche Methode wie die endgültige Summierungslinie zu verwenden? – phelbin

+0

@phelbin - Persönlich würde ich die Art und Weise verwenden, die Sie ursprünglich hatten (obwohl ich wahrscheinlich einen zusätzlichen Eintrag in alRowFormula, die auf die Zeile nach der letzten Zeile - so vermeiden separate Verarbeitung für die letzte Transaktion Kopfzeile) dämmte, aber ich einfach Ich dachte, ich würde die Verwendung von .Sum für die ersten Datensätze vorschlagen, so dass Ihr Code "konsistent" wäre. – YowE3K

Verwandte Themen