Anzeige
Archiv - Navigation
1584to1588
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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! :)

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.
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😕
Anzeige
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))

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 :)
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 😄
Anzeige
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

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige