Hallo Freddy,
es gibt verschiedene Arten, eine solche Schleife aufzubauen. Meine Art ist eine For Next Schleife. Damit beantworte ich gleich die Frage, warum ich die letzte Zeile ermittle. Mit der For Next Schleife gebe ich an, wo gestartet und gestoppt werden soll. Die Startzeile gebe ich direkt an, die weiss ich ja. Irgendwo muss aber die Schleife auch aufhoeren. Und da kommt die letzte Zeile ins Spiel. Die ermittle ich, um der Schleife zu sagen, wenn du das Ende der Tabelle erreichst, dann stop. Mit der Variablen Anzahl habe ich der Berechnung uebergeben, wieviele Zeilen berechnet werden sollen. Das Weiterruecken um eine Zeile fuer die naechste Berechnung geht dann bei der For Next Schleife automatisch, weil die ohne extra Angabe immer eins weiterzaehlt. Also brauchst du keinen Zaehler, wie in deiner Do Loop Schleife. Wenn du die Schrittezahl veraendern willst, sagst du das der For Next Schleife einfach indem du den Step angibst. Z.B.
For i = 2 To letzteA Step 2
In dem Falle wuerde die Schleife immer 2 Zeilen weiterrutschen. Auch wieder bis zur letzten Zeile und dann stop.
Was du in deiner Do Loop Schleife getan hast, die mit dem Recorder aufgezeichnet ist: Du hast in A20 eine Formel eingetragen, um die Berechnung durchzufuehren. Auch eine Moeglichkeit. Aber ich meine immer, wenn ich schon mit VBA arbeite, dann mach ich auch die Berechnung direkt in VBA. Deshalb habe ich die Anweisung Application.WorksheetFunction.Average.... benutzt. Die macht das gleiche wie deine Formel, ist aber flexibler, was Variablenbenutzung angeht. Die Formel umzuschreiben, wie du es versucht hast, ist immer etwas schwierig und kompliziert. Ich habe da auch immer Probleme, deshalb mach ich das nicht gerne. Weil das zu fehleranfaellig ist. Ich meine, man kann zu viele Fehler machen und findet diese dann vielleicht nicht.
In deinem Versuch koenntest du also auch mit dieser Anweisung arbeiten. So:
Sub AverageHelp()
'
' AverageHelp Macro
'
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
Dim x As Variant
x = 1 'weil er in zeile 2 anfangen soll'
Do
x = x + 1
Range("A20") = Application.WorksheetFunction.Average(ws.Range("A" & x & ":A" & x + 4))
Loop Until x > 18 'In zeile 18 sind meine letzten werte'
End Sub
Uebrigens. Das Weiterruecken um eine Zeile ist gut geloest von dir mit dem Zaehler x.
Hier zur Erklaerung, wie ich die Range fuer die Berechnung zusammengesetzt habe. Eine Range Angabe muss immer so aussehen:
Range("A20") fuer eine einzelne Zelle. Range("A2:A6") fuer einen Bereich aus mehreren Zellen. Also die Angabe in Klammern ist immer ein Textstring. Das kannst du ausnutzen, um diesen String mit Variablen aufzubauen. Die festen Zeichen musst du hierbei in Anfuehrungszeichen setzen und die Variablen mit & oder + einfuegen. Also die Range, die im ersten Schleifendurchlauf berechnet wuerde, waere hier Range("A2:A6"), weil x = 2 ist. Die + 4 am Ende ist die Anzahl Zeilen, die berechnet werden sollen. Diese hatte ich in der variablen "Anzahl" gespeichert. Erinnerst du dich? Also koennte ich auch noch diese + 4 ersetzen mit der Variablen:
Range("A20") = Application.WorksheetFunction.Average(ws.Range("A" & x & ":A" & x + Anzahl))
Die muss natuerlich am Anfang noch deklariert und gefuellt werden.
Dein Loop Until x > 18 ist ja ok, wenn du immer weisst, wo deine letzte Zeile ist. Aber bei grossen und veraenderlichen Datenmengen nicht immer moeglich. Deshalb sollte man auch hier, wie ich, mit der Ermittlung der letzten befuellten Zeile arbeiten. Sonst kann es passieren, dass du die Schleife zu kurz oder zu lang machst, wenn sich die letzte Zeile veraendert. Ausserdem, wenn eine Veraenderung auftritt, muesstest du immer den Code aendern.
Ich hoffe, du verstehst manches etwas besser jetzt.
Gruss Torsten
|