Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.10.2025 10:28:49
16.10.2025 17:40:39
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: For - Next - Schleife rückwärts

For - Next - Schleife rückwärts
06.10.2017 22:18:29
Bernd
Hallo zusammen,
mal wieder benötige als Anfänger eure Mithilfe.
Ich habe per csv-Datei einen Aktienkurs eingefügt:
Userbild
1. In den Zeilen rechts der Tabelle möchte ich den EMA (eine Art gleitenden Durchschnitt) berechnen.
Die Formel hierfür lautet: EMAt = EMAt-1 +(SF*(Ct-EMAt-1)), also der EMA von heute ist gleich der EMA von gestern + (einem Glättungsfaktor - (EMA von gestern)).
Folgendes habe ich nun programmiert (Auf Anfängerfehler darf gerne hingewiesen werden):
Sub Test()
'Berechnung EMA
Dim EMA_Tage As Integer
Dim Anfang As Integer
Dim Ende As Integer
Dim zaehler1 As Integer
Dim m As Long
EMA_Tage = 5
Anfang = 4
Ende = Cells(Rows.Count, 1).End(xlUp).Row
Hier werden die Variablen definiert.
EMA_Tage ist der Zeitraum der Berechnung des gleitenden Durchschnittes
Anfang ist der Beginn der Tabelle
Ende ist die Ermittlung der letzten Reihe mit Inhalt

Range("H3").Value = "EMA5"
H3 bekommt eine Überschrift.

'Formel laut Internet: EMAt = EMAt-1 +(SF*(Ct-EMAt-1))
Cells(Ende, 5).Copy Cells(Ende, 8)
Der Schlusskurs der letzten Zeile wird kopiert, ist sozusagen der Anfangswert der Berechnung.
Und nun soll in die vorletzte Zeile die obige EMA Formel geschrieben werden. Diese habe ich mangels Erfahrung von Hand ins Excel geschrieben, ein Makro währenddessen aufgenommen und somit doe unten stehende Formel erhalten. Diese Formel soll nun nach oben "gezogen" werden bis in die erste Reihe.

For m = Ende To Anfang + 1 Step -1
Cells(Ende - 1 - Ende + m, 8).FormulaR1C1 = "=R[1]C+(0.8*(RC[-3]-R[1]C))"
Next m
End Sub
So wie sie jetzt ist funktionierts, aber nur weil ich an allen möglichen Stellen mit +1 bzw. -1 solange nachgebessert habe, bis das rauskam was ich wollte... :-D
Wie programmier ich das richtig? (Weil manchmal Range und manchmal Cells steht... da ist viel ausm Internet zusammenkopiert :-D )
2. In der obigen Formel steht in der Klammer "0,8". Eigentlich sollte dort die Variable "SF" stehen, die dem Glättungsfaktor entspricht. Für diesen gibt es eine einfache Formel. Aber mit der Variable SF funktioniert die Formel nicht mehr.... Wieso? :)
3. In der Spalte H rechne ich ja oben mit einem EMA_Tage = 5 und einem Glättungsfaktor von 0,8 (oder so). In Spalte I möchte ich mit EMA_Tage = 10 und anderem Glättungsfaktor rechnen. In Spalte J mit EMA_Tage = 20 und so weiter und so fort. Wie kann ich das vereinfachen, dass ich nur schreiben Spalte = J und EMA_Tage = 20? Nicht dass ich jedes mal die gleiche Formel einprogrammiere?
Vielen Dank für Eure Hilfe vorab! :)
Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: For - Next - Schleife rückwärts
06.10.2017 23:40:47
onur
Bei VBA gibt es Variablen, aber nicht bei Excel - Variablen in Excel-Formeln einzubauen geht nicht. Du kannst nicht VBA-Befehle (Variablen) mit Excel-Befehlen vermischen. Schreibe eine eigene Funktion für deine Formel (die ja mathematisch gesehen eine Funktion ist) und du kannst sie auch in Excel für die betroffenen Zellen verwenden. Du kannst dann SF public deklarieren oder erst in der funktion selber setzen. EMA_Tage kannst du direkt mit übergeben.
Anzeige
AW: For - Next - Schleife rückwärts
07.10.2017 10:31:10
Bernd
Danke für deine schnelle Antwort..
Leider ist mir nicht so ganz klar was du mit Funktion und übergeben meinst... Bin leider noch auf Angler Niveau😕
AW: For - Next - Schleife rückwärts
07.10.2017 19:22:49
onur
Das hier in ein Modul:
Public Function EMAt(ByVal Last As Double, ByVal SF As Single, ByVal Ct As Double) As Double
EMAt = Last + SF * (Ct - Last)
If Last = 0 Then EMAt = Ct
End Function

Dann kannst du die Funktion verwenden, als wäre sie ein Teil von Excel.
z.B. einfach in die Zelle schreiben (und runterkopieren):
=EMAt(Z(1)S;0,8;ZS(-3))

Anzeige
AW: For - Next - Schleife rückwärts
07.10.2017 11:12:01
Nepumuk
Hallo Bernd,
du brauchst gar keine Schleife. Mach es einfach so:
Dim SF As String
SF = "0.8"
Range(Cells(5, 8), Cells(Rows.Count, 1).End(xlUp).Offset(0, 7)).FormulaR1C1 = _
    "=R[1]C+(" & SF & "*(RC[-3]-R[1]C))"

Gruß
Nepumuk
Anzeige
AW: For - Next - Schleife rückwärts
07.10.2017 21:45:39
Bernd
Danke für Eure Antworten :)
Nepomuk, Deine Formel habe ich eingefügt und habe diese nach einigem Versuchen etwas abgeändert.
Bei dir steht ....Offset(0, 7)... ich habe dies auf .Offset(-1, 7) geändert. Hintergrund: In der letzten Zelle steht schon ein anderer Wert. Wenn ich nun das Makro ausführe, wird die Formel gerechnet und nach oben gezogen, allerdings fehlt eine Zeile, die Formel sollte also noch eine Zeile nach oben gezogen werden. Welchen Wert muss ich da denn ändern :)
Anzeige
AW: For - Next - Schleife rückwärts
07.10.2017 21:47:55
Nepumuk
Hallo Bernd,
dann an Stelle Cells(5, 8) einfach Cells(4, 8)
Gruß
Nepumuk
AW: For - Next - Schleife rückwärts
07.10.2017 23:02:34
Bernd
Ah ok dann verstehe ich auch die Formel...
Danke für die geduldige Hilfe 😄
AW: For - Next - Schleife rückwärts
08.10.2017 21:43:13
Bernd
Sorry, jetzt sind mir beim Arbeiten noch einige Fragen gekommen:
Ich habe nun die Formel eingefügt
Range(Cells(4, 9), Cells(Rows.Count, 1).End(xlUp).Offset(-1, 8)).FormulaR1C1 = _
"=R[1]C+(" & SF & "*(RC[-4]-R[1]C))"
Funktioniert soweit ganz toll :)
Frage 1:
In der Formel ist die Variable "SF". Wenn ich diese als "=0,8" setze, funktioniert es. Wenn ich diese als "=1/10+1" setzt, bekomme ich auch ein Ergebnis. Wenn ich diese aber als "=1/EMA_Tage+1" setze, als in Verbindung mit einer anderen Variable, bekomme ich eine Fehlermeldung. Wo liegt hier der Fehler oder geht das nicht?
Frage 2:
Was muss ich in die Formel einbauen, damit das Ergebnis nachher in meiner Zelle auf 2 Stellen nach dem Komma gerundet wird?
Frage 3:
Wenn ich die obige Formel in unterschiedliche Spalten einbauen möchte, muss ich Stand jetzt (mit meinem Anfängerwissen) die Formel kopieren und von Hand so umbauen, dass sie für eine Spalte weiter rechts auch funktioniert.
Sehe ich es richtig, dass ich jetzt auch eine Variable "Spalte" definieren kann und in die Formel einbauen kann?
Für den fett markierten Anfang ist mir das noch klar, aber durch unterschiedliche Spalten ändert sich ja auch der unten kursive Offset und eine kursive Zahl in dieser R1C1 Formel:
Range(Cells(4, 9), Cells(Rows.Count, 1).End(xlUp).Offset(-1, 8)).FormulaR1C1 = _
"=R[1]C+(" & SF & "*(RC[-4]-R[1]C))"
Vielleicht wären hier Absolutbezüge geeigneter?
Es wäre schön, wenn mir hier nochmal einer helfen könnte. :)
Vielen Dank hier für vorab!
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

For - Next - Schleife rückwärts in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Variablen definieren: Lege zunächst die benötigten Variablen fest. Diese sind wichtig für die Berechnung des exponentiellen gleitenden Durchschnitts (EMA).

    Sub Test()
       Dim EMA_Tage As Integer
       Dim Anfang As Integer
       Dim Ende As Integer
       Dim m As Long
       Dim SF As Double
       EMA_Tage = 5
       SF = 0.8 ' Glättungsfaktor
       Anfang = 4
       Ende = Cells(Rows.Count, 1).End(xlUp).Row
  2. Überschrift setzen: Setze eine Überschrift in der gewünschten Zelle.

    Range("H3").Value = "EMA5"
  3. Ersten Wert kopieren: Kopiere den Schlusskurs der letzten Zeile in die Zelle für den EMA.

    Cells(Ende, 5).Copy Cells(Ende, 8)
  4. For - Next - Schleife programmieren: Verwende die Schleife rückwärts, um die EMA-Werte zu berechnen.

    For m = Ende To Anfang + 1 Step -1
       Cells(Ende - 1 - Ende + m, 8).FormulaR1C1 = "=R[1]C + (" & SF & " * (RC[-3] - R[1]C))"
    Next m
    End Sub

Häufige Fehler und Lösungen

  • Fehler bei der Verwendung von Variablen: Es kann zu Problemen kommen, wenn du versuchst, VBA-Variablen in Excel-Formeln zu verwenden. Stelle sicher, dass deine Variablen wie SF korrekt deklariert sind und dass du sie in der Formel richtig einsetzt.

  • Falsche Zellreferenzen: Achte darauf, dass die Zellreferenzen in deiner Schleife korrekt sind. Ein häufiger Fehler ist, falsche Indizes zu verwenden, was dazu führen kann, dass die Formel nicht wie erwartet funktioniert.

  • Rundungsfehler: Um das Ergebnis auf zwei Nachkommastellen zu runden, kannst du die Round-Funktion in deiner Formel verwenden:

    Cells(Ende - 1 - Ende + m, 8).FormulaR1C1 = "=Round(R[1]C + (" & SF & " * (RC[-3] - R[1]C)), 2)"

Alternative Methoden

Wenn du die VBA For Schleife rückwärts vermeiden möchtest, kannst du die Formeln direkt in die Zellen einfügen, ohne eine Schleife zu verwenden. Zum Beispiel:

Range(Cells(4, 8), Cells(Rows.Count, 1).End(xlUp).Offset(-1, 7)).FormulaR1C1 = _
    "=R[1]C + (" & SF & " * (RC[-3] - R[1]C))"

Diese Methode ist oft einfacher und effizienter, insbesondere bei größeren Datenmengen.


Praktische Beispiele

Hier ist ein Beispiel, wie du den Glättungsfaktor berechnen und die EMA für verschiedene Zeiträume in unterschiedlichen Spalten berechnen kannst:

Dim Spalte As Integer
For Spalte = 9 To 11 ' Beispiel: Spalten I (9) bis K (11)
    EMA_Tage = (Spalte - 8) * 5 ' Beispiel für unterschiedliche EMA_Tage
    SF = 1 / EMA_Tage
    Range(Cells(4, Spalte), Cells(Rows.Count, 1).End(xlUp).Offset(-1, Spalte - 8)).FormulaR1C1 = _
        "=R[1]C + (" & SF & " * (RC[-4] - R[1]C))"
Next Spalte

Tipps für Profis

  • Verwendung von Funktionen: Erstelle eigene Funktionen für wiederkehrende Berechnungen, um deinen Code zu organisieren und zu vereinfachen. Zum Beispiel kannst du eine Funktion für die EMA-Berechnung erstellen:

    Public Function EMAt(ByVal Last As Double, ByVal SF As Single, ByVal Ct As Double) As Double
      EMAt = Last + SF * (Ct - Last)
      If Last = 0 Then EMAt = Ct
    End Function
  • Verwendung von Absolutbezügen: Um die Formeln flexibler zu gestalten, kannst du auch Absolutbezüge verwenden, um sicherzustellen, dass sich die

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige