Moin! Kein Problem. Also die Sub heißt ja wie folgt:
Private Sub Worksheet_Change(ByVal Target As Range)
Das heißt, wenn sich was ändert springt sie an. Der Sub wird dabei der Bereich der sich geändert hat übergeben. Der Bereich ist Target. Da der Code am Anfang abfragt, ob target.count = 1 ist (also nur eine Zelle) wird sichergestellt, dass es nicht ein Bereich ist. Das ist wichtig für die weiteren Bezüge auf Target.
Das mod steht für Modulo und bedeutet Division mit Rest. In VBA gibt dies den Rest an der übrig bleibt. 15 mod 5 ist also 0 das 15 durch 5 keinen Rest hat. 14 mod 3 ist 2 da 14 = 3 * 4 +2 ist.
Soweit zur Einleitung. Jetzt bnen bissl was zum Lesen.
'für den weiteren Code von Bedeutung. Du startest in Zeile 5 und hast eine Überlappung von 4. Deswegen wird auch 5, 9, 13 usw. addiert.
'die ersten Zeilen mit untersch. WErten sind also ( schon mal mit den Resten)
'Zeile 5 Divison durch 4 ist Rest 1
'Zeile 6 Divison durch 4 ist Rest 2
'Zeile 7 Divison durch 4 ist Rest 3
'Zeile 8 Divison durch 4 ist Rest 0
'jetzt geht es zwar weiter, es beginnt aber ein neuer Zyklus von dem viererpack an Werten, die Reste sind dann wieder die selben
'Summe in Spalte D
'da der vierte Wert unten nicht summiert werden soll und auch nicht in D, braucht dort nix eingtragen werden. dei vierte Reihe ist wenn de Rest 0 ist.
'wenn als die Reihe als Rest mehr als 0 hat, wird in der Reihe der Änderunge = target.row (die Reihe der geänderten Zeile) die Summe von der Zellen in
'Spalte 5 = E bis 32 = EF :-) gerechnet
If (Target.Row Mod 4) <> 0 Then Cells(Target.Row, 4).Value = Application.WorksheetFunction.Sum(Range(Cells(Target.Row, 5), Cells(Target.Row, 32)))
'jetzt summieren
'jetzt die Spalte summieren
'Spalte nimmt den Werte der Spalte der geänderten Zellen auf, wird dann für das Eintragungen der Summe unten genutzt
spalte = Target.Column
'so hier mal die Summe auf 0 setzen, damit nicht da noch was falsches drin steht
summe = 0
'jeden vierten wert addieren
'jetzt wird noch ein Versatz berechnet. Das ist eigentlich der Rest von der Division oben. Den nutze ich um dann unten durch alle Zeilen zu gehen
' und den jeweiligen ersten, zweiten bzw. dritten zu addieren
versatz = (Target.Row Mod 4)
'versatz 0 ist immer beim vierten WErt in Zeile 8 beginnend dort nix machen, deshalb ist der Zweig von if then leer
If versatz = 0 Then
'also nix machen, da wir in der vierten Zeile sind
Else
'einer der 3 anderen Zeilen
' 4 + versatz ergibt die richtige Anfangszeile
' bspw. Zeile 5 ergibt Rest 1 plus 4 also 5 als Startwert, dann wird in jedem Durchlauf immer 4 addiert - gilt durch step 4
' kanst das ja mal für Zeile 6 beginnend durchrechnen
' das ganze bis zeilesum -1 ; zeilesum ist die Zeile mit dem Wort Summe in A, in der Zeile wird ja die erste Summe eingetragen
' deshalb gehen deine Daten bis eine Zeile davor , also -1, ist das erreicht, bricht die Summe ab
For l = 4 + versatz To zeilesum - 1 Step 4
' zur summe wird also immer der Wert aus der nächsten Zeile mit Versatz 4 aus der Spalte die geändert wurde addiert
summe = summe + ActiveSheet.Cells(l, spalte)
Next l
End If
'jetzt eintragen
' dazu wird aber ein andere Versatz gebraucht. Wir wissen ja, dass zeilesum die Zeile ist, in der die erste Summe eingetragen wird
'die zweite Summe dann eins tiefer.
' bei der Resten wie oben past dass nicht. Also ziehen wir eins ab.
'somit gilt bei den Zeilen von Spalte 5 beginnend einen Versat 0
' ab 6 beginnend Versatz 1 usw.
' Zeile ab 8 hat -1, da soll ja nix eingetragen werden.
' der GEdanke ist, zur zeilesum den neuen Versatz zu addieren und dann in der zeile zu sein, wo die Summe hi nsoll
' also versatz berechnen
versatz = (Target.Row Mod 4 - 1)
' wenn -1 dann nix ,ist ja immer die 4te Zeile
If versatz = -1 Then
Else
'jetzt also eintragen, zeilesum + versatz ergibt bei R5 beginend also zeilesum +0 = zeilesum, da wollte wir ja hin
' bie E6 beginnend ist versatz 1 also zeilesum +1 die nächste Zeile past auch , spalte ist immer noch die Spalte der Änderung
'also in die Zelle die SUmme eintragen
ActiveSheet.Cells(zeilesum + versatz, spalte) = summe
End If
'Gesamtsumme aber in Spalte B
' jetzt in Spalte B eins unter der zeilesum ddie Summe aus Spalte 5 eintragen. Dabei wird ab Zeile 5 bis eine Zeile vor zeilesum addiert, das war jader der Beriech der DAten
ActiveSheet.Cells(zeilesum + 1, 2) = Application.WorksheetFunction.Sum(Range(Cells(5, 4), Cells(zeilesum - 1, 4)))
Ich hoffe das war verständlich. Ansonsten einfach nochmal fragen, wenn was unklar ist. An Stelle von dem mod Wert, könnte man das auch mit Versatz machen und dort immer 4 dazuaddieren. Finde das so aber immer schöner. VG
|