Gleitender Durchschnittlicher Vba Code


Rolling Average Table Im Folgenden werden wir ein Programm in Excel VBA, dass eine rollende durchschnittliche Tabelle erstellt wird. Platzieren Sie eine Befehlsschaltfläche auf Ihrem Arbeitsblatt und fügen Sie die folgende Codezeile hinzu: Bereich (quotB3quot).Value WorksheetFunction. RandBetween (0, 100) Diese Codezeile gibt eine Zufallszahl zwischen 0 und 100 in Zelle B3 ein. Wir wollen, dass Excel VBA den neuen Aktienwert annimmt und an die erste Position der rollenden Durchschnittstabelle setzt. Alle anderen Werte sollten sich um eine Stelle bewegen und der letzte Wert sollte gelöscht werden. Erstellen Sie ein Worksheet-Änderungsereignis. Code, der dem Worksheet Change Event hinzugefügt wird, wird von Excel VBA ausgeführt, wenn Sie eine Zelle in einem Arbeitsblatt ändern. 2. Doppelklicken Sie im Projekt-Explorer auf Sheet1 (Sheet1). 3. Wählen Sie in der linken Dropdown-Liste Arbeitsblatt aus. Wählen Sie Ändern aus der rechten Dropdown-Liste. Fügen Sie dem Worksheet Change Event die folgenden Codezeilen hinzu: 4. Deklarieren Sie eine Variable namens newvalue vom Typ Integer und zwei Bereiche (firstfourvalues ​​und lastfourvalues). Dim newvalue Als Integer. Firstfourvalues ​​As Range, lastfourvalues ​​As Range 5. Das Worksheet Change-Ereignis hört alle Änderungen auf Sheet1. Wir wollen nur Excel VBA, etwas zu tun, wenn etwas in Zelle B3 ändert. Um dies zu erreichen, fügen Sie die folgende Codezeile hinzu: If Target. Address quotB3quot Then 6. Wir initialisieren newvalue mit dem Wert von Zelle B3, firstfourvalues ​​mit Range (quotD3: D6quot) und lastfourvalues ​​mit Range (quotD4: D7quot). Newvalue Bereich (quotB3quot).Value Set firstfourvalues ​​Bereich (quotD3: D6quot) Set lastfourvalues ​​Bereich (quotD4: D7quot) 7. Jetzt kommt der einfache Trick. Wir möchten die Rolling-Average-Tabelle aktualisieren. Sie können dies erreichen, indem Sie die letzten vier Werte durch die ersten vier Werte der Tabelle ersetzen und den neuen Aktienwert an die erste Position setzen. Lastfourvalues. Value firstfourvalues. Value Bereich (quotD3quot).Value newvalue 8. Vergessen Sie nicht, die if-Anweisung zu schließen. 9. Geben Sie abschließend die Formel AVERAGE (D3: D7) in die Zelle D8 ein. 10. Testen Sie das Programm, indem Sie auf die Befehlsschaltfläche klicken. Hier ist ein Code, der für diejenigen hilfreich sein sollte, die technische Analysen im Handel verwenden und Strategien in Excel testen möchten. Sie berechnet den einfachen, linear gewichteten und exponentiellen gleitenden Durchschnitt. Weiter werde ich die Schritte zur Erstellung des Formulars und des VBA-Codes vorstellen und erläutern. Einfügen einer UserForm 8211 Name: MAForm Fügen Sie vier Labels aus den Toolbox-Steuerelementen hinzu 8211 Beschriftungen wie im obigen Druckbildschirm Fügen Sie eine ComboBox für die gleitende durchschnittliche Typauswahl hinzu. Es heißt comboTypeMA Fügen Sie zwei RefEdit-Steuerelemente für den Eingabebereich und den Ausgabebereich hinzu. Fügen Sie eine TextBox hinzu, um die gleitende durchschnittliche Periode zu selektieren. Fügen Sie zwei Schaltflächen hinzu: Name: buttonSubmit, Caption: Submit und Name: buttonCancel, Caption: Cancel Um die Dropdown-Liste für die MA-Typ-Auswahl zu generieren und das User-Formular zu laden, ein neues Modul Wird mit dem unten stehenden Code eingefügt. Die ComboBox-Elemente, die mit gleitenden Durchschnittswerten und dem Benutzerformular gefüllt werden, werden geladen. Option Explicit Sub loadMAForm () Mit MAFormboTypeMA. RowSource. AddItem Einfach. AddItem Gewichtet. AddItem Exponentielles Ende Mit MAForm. Show End Sub Unten ist der Code, der der Schaltfläche Submit zugeschrieben wird. Private Sub buttonSubmitClick () Dim inputRange, outputRange Als Bereich Der inputRange enthält die Preisreihen, die für die Berechnung der MAs verwendet werden, und der outputRange wird mit den gleitenden Durchschnittswerten gefüllt. Dim inputPeriod As Integer Der gleitende Durchschnittszeitraum wird deklariert. Dim inputAddress, outputAddress As String Die als String deklarierten Eingabe - und Ausgabebereiche. Wenn comboTypeMA. Value ltgt Exponential und comboTypeMA. Value ltgt Einfach und comboTypeMA. Value ltgt Weighted True Dann MsgBox Wählen Sie einen gleitenden Durchschnittstyp aus der Liste aus. RefInputRange. SetFocus Exit Sub Dieser Teil der Prozedur erzwingt die ersten Einschränkungen bezüglich der übermittelten Daten. Wenn der gleitende Durchschnittstyp nicht in der Dropdown-Liste enthalten ist, wird der Vorgang nicht zum nächsten Schritt fortgesetzt, und der Benutzer wird aufgefordert, ihn erneut auszuwählen. ElseIf RefInputRange. Value Then MsgBox Bitte wählen Sie den Eingabebereich. RefInputRange. SetFocus Exit Sub ElseIf RefOutputRange. Value Dann MsgBox Bitte wählen Sie den Ausgabebereich. RefOutputRange. SetFocus Exit Sub ElseIf RefInputPeriod. Value Then MsgBox Bitte wählen Sie die gleitende durchschnittliche Periode. RefInputPeriod. SetFocus Exit Sub ElseIf Nicht IsNumeric (RefInputPeriod. Value) Dann MsgBox Moving durchschnittliche Periode muss eine Zahl sein. RefInputPeriod. SetFocus Exit Sub End If Weitere Einschränkungen werden erstellt. Eingabebereich, Ausgabebereich und Eingabeperiode dürfen nicht leer sein. Auch die gleitende durchschnittliche Periode muss eine Zahl sein. inputAddress RefInputRange. Value Set inputRange Range (inputAddress) outputAddress RefOutputRange. Value Set outputRange Range (outputAddress) inputPeriod RefInputPeriod. Value Die Argumente für inputRange und outputRange Bereiche werden inputAddress und outputAddress als Strings deklariert. If inputRange. Columns. Count ltgt 1 Dann kann der MsgBox-Eingabebereich nur eine Spalte haben. RefInputRange. SetFocus Exit Sub Der inputRange darf nur eine Spalte enthalten. ElseIf inputRange. Rows. Count ltgt outputRange. Rows. Count Dann hat der MsgBox-Ausgabebereich eine andere Anzahl von Zeilen als der Eingabebereich. RefInputRange. SetFocus Exit Sub End If Die inputRange und outputRange müssen eine gleiche Anzahl von Zeilen haben. Dim RowCount As Integer RowCount inputRange. Rows. Count Dim CROW As Integer ReDim inputarray (1 bis RowCount) Für crow 1 Um RowCount inputarray (CROW) inputRange. Cells (krähe, 1).Value Next CROW inputarray als Array deklariert ist und it8217s Elemente Entsprechen den Werten aus jeder Zeile des Eingangsbereichs. Wenn inputPeriod gt RowCount Then MsgBox Anzahl der ausgewählten Beobachtungen ist amp RowCount amp und die Periode ist amp inputPeriod amp. Der Eingangsbereich muss eine höhere oder gleiche Anzahl von Elementen haben als der ausgewählte Zeitraum. RefInputRange. SetFocus Exit Sub End Wenn eine weitere Einschränkung hinzugefügt wird 8211 Der Eingabebereich muss eine höhere oder gleiche Menge an Elementen als die Periode haben. Wenn inputPeriod lt 0 dann MsgBox Moving durchschnittliche Periode größer als 0 sein muss. RefInputPeriod. SetFocus Exit Sub End If Die gleitende durchschnittliche Periode muss größer als Null sein. ReDim outputarray (inputPeriod To RowCount) Als Variant werden auch die Array-Dimensionen von outputarray bestimmt. Die untere Schranke des Arrays ist der Wert inputPeriod und die obere Schranke der Wert von RowCount (die Anzahl der Elemente im inputRange). Im folgenden Teil der Prozedur wurde der einfache gleitende Durchschnitt berechnet, wenn die Auswahl für comboTypeMA einfach ist. SMA ----------------------------------------- Wenn comboTypeMA. Value Simple Then Dim i , j As Integer Dim Temp As Double Für i inputPeriod Um RowCount Temp 0 für j (i - (inputPeriod - 1)) bis i Temp Temp inputarray (j) Next j output (i) Temp inputPeriod outputRange. Cells (i, 1).Value outputarray (i) Next outputRange. Cells (0, 1).Value SMA (amp inputPeriod amp) Grundsätzlich berechnet die Prozedur den gleitenden Durchschnitt der letzten x Zahlen (x entspricht der inputPeriod), beginnend mit dem Element von Das Inputarray gleich der inputPeriod. Unten ist ein vereinfachtes Beispiel, das jeden Schritt des Verfahrens zeigt. In diesem Beispiel gibt es vier Ziffern (no01, no02, no03 und no04) von Zeile 1 bis Zeile 4 und die gleitende durchschnittliche Periode ist 3. Nach jedem neuen gleitenden Durchschnitt berechnet jede Zelle des outputRange den Wert aus dem Wert Ausgabearray. Und nachdem alle gleitenden Mittelwerte berechnet werden, wird in der Zelle über outputRange ein Titel eingefügt, der den gleitenden Durchschnittstyp und die Periode enthält. Dieser nächste Teil wird den exponentiellen gleitenden Durchschnitt berechnen. EMA ------------------------------------------ ElseIf comboTypeMA. Value Exponential Dann Dim Alpha As Doppeltes alpha 2 (inputPeriod 1) Für j 1 Zu inputPeriod temp temp inputarray (j) Nächstes j outputarray (inputPeriod) temp inputPeriod Zunächst wird der Wert von alpha bestimmt. Da bei der Berechnung der Wert der EMA auf der vorherigen EMA basiert, wird der erste der einfache gleitende Durchschnitt sein. (I - 1) alpha (inputarray (i) - outputarray (i - 1)) Next i Beginnend mit dem zweiten gleitenden Durchschnitt werden sie auf der Grundlage der obigen Formel berechnet: Vorherige EMA plus alpha multipliziert mit der Differenz zwischen der aktuellen Zahl aus dem Eingangsarray und dem vorherigen EMA-Wert. Denn ich RowCount outputRange. Cells (i, 1) inputPeriod. Wert output (i) Next i outputRange. Cells (0, 1).Value EMA (amp inputPeriod amp) Genau wie der Code für SMA, wird die output bevölkert und Die Zelle über Outputarray repräsentiert den Typ und die Periode des gleitenden Durchschnitts. Unten ist der Code für die Berechnung der gewichteten gleitenden Durchschnitt. WMA ------------------------------------------ ElseIf comboTypeMA. Value Weighted Then Dim TEMP2 As Integer For i inputPeriod Um RowCount Temp 0 temp2 0 für j (i - (inputPeriod - 1)) bis i Temp Temp inputarray (j) (j - i inputPeriod) TEMP2 TEMP2 (j - i inputPeriod) Next j output (i ) Temp temp2 outputRange. Cells (i, 1).Value output (i) Next i outputRange. Cells (0, 1).Value WMA (amp inputPeriod amp) End If die folgenden Tabelle sind die Schritte zur Berechnung der einzelnen variablen enthält, die für die verwendete WMA-Berechnung. Genau wie im vorherigen Beispiel, in diesem gibt es für Zahlen im inputRange. Und die Eingabeperiode ist 3. Unten ist der endgültige Code der Prozedur, die das Benutzerformular entlädt. Unload MAForm End Sub Die folgende Prozedur ist für die Schaltfläche Abbrechen. Es wird in demselben Modul hinzugefügt. Private Sub buttonCancelClick () Unload MAForm End SubMoving Durchschnittliche Berechnung Moving Average Berechnungen Moving Average Berechnung Ich versuche, einen gleitenden Durchschnitt für eine Reihe von Daten zu berechnen. Ich möchte den gleitenden Durchschnitt für jeden Punkt innerhalb der Daten generieren, um in einem Diagramm zu zeigen. Wie auch immer, unten ist ein Beispiel von MS Support. Ich habe den Brief gefolgt, aber mir gibt nicht einen gleitenden Durchschnitt. Es wiederholt den gleichen Datenpunkt über und über (der erste Datenpunkt). So glaube ich nicht, dass die Funktion das startdate in der MyRST. Seek Linie findet, also gerade die Rückgabe des ersten Datenpunktes. Schließlich (vielleicht macht dies wirklich einfach) Ich bin verwirrt darüber, wie die Indizes funktionieren. Ich dachte, Sie könnten nur einen Primärschlüssel haben, aber anscheinend können Sie mehrere Feldbeschränkungen erstellen. Ich habe versucht, dies mit der folgenden Datendefinitionsabfrage zu tun: ALTER TABLE Table1 ADD CONSTRAINT NoDupes UNIQUE (CurrencyType, TransactionDate) Sorry über die Länge dieses Beitrags. Ich schätze Ihre Hilfe. Die folgende Beispielfunktion berechnet Bewegungsdurchschnitte basierend auf einer Tabelle mit einem Mehrfachfeld-Primärschlüssel. Für dieses Beispiel werden die wöchentlichen Werte der Fremdwährungen verwendet. Gehen Sie folgendermaßen vor, um die Beispielfunktion zu erstellen: Erstellen Sie die folgende Tabelle, und speichern Sie es als Table1: Tabelle: Table1 --------------------------- -------------- Feldname: CurrencyType Primärschlüssel Datentyp: Text Feldgröße: 25 Feldname: TransactionDate Primärschlüssel Datentyp: DateTime Format: Kurzdatum Feldname: Datentyp: Währung Dezimalstellen: 4 Zeigen Sie die Tabelle in der Datenblattansicht an und geben Sie die folgenden Werte ein: CurrencyType TransactionDate Rate ------------------------------- ------------- Yen 8693 0.0079 Yen 81393 0.0082 Yen 82093 0.0085 Yen 82793 0.0088 Yen 9393 0.0091 Mark 8693 0.5600 Mark 81393 0.5700 Mark 82093 0.5800 Mark 82793 0.5900 Mark 9393 0.6000 Öffnen Sie ein neues Modul und geben Sie die folgende Funktionen: Funktion MAvgs (Perioden As Integer, Startdatum, Type-Name) Dim MyDB Als DATABASE, MyRST Als Recordset, MySum As Double Dim i, Satz x MyDB CurrentDb () Set MyRST MyDB. OpenRecordset (Tabelle 1) On Error Resume Next MyRST. Index PrimaryKey x Periods - 1 ReDim Store (x) MySum 0 Für i 0 Zu x MyRST. MoveFirst MyRST. Seek, TypeName, StartDate Diese beiden Variablen sollten in der gleichen Reihenfolge sein wie die Primärschlüsselfelder in Ihrer Tabelle. Store (i) MyRSTRate If i lt x Then StartDate StartDate - 7 Die 7 hier nimmt wöchentliche Daten 1 für Tagesdaten an. Wenn StartDate lt 8693 Dann wird MAvgs Null: Exit Function 8693 durch das früheste Datum der Daten in Ihrer Tabelle ersetzt. MySum-Speicher (i) MySum Next i MAvgs MySum-Perioden MyRST. Close-Endfunktion Erstellen Sie die folgende Abfrage auf der Grundlage der Tabelle1-Tabelle: Query: Query1 --------------------- ---------------------------------- Feld: CurrencyType Feld: TransactionDate Feld: Ratenfeld: Expr1: MAvgs (3 , TransactionDate, CurrencyType) HINWEIS: Diese Abfrage erzeugt einen dreiwöchigen gleitenden Durchschnitt der Rate-Daten. Um einen längeren oder kürzeren gleitenden Durchschnitt zu berechnen, ändern Sie die Zahl 3 in der Spalte Ausdrücke 1 von Spalte auf den Wert, den Sie berechnen möchten. Führen Sie die Abfrage aus. Beachten Sie, dass Sie die folgenden drei Wochen gleitenden Durchschnitt für jede Währung sehen. Ein Null-Wert zeigt an, dass nicht genug frühere Werte vorhanden sind, um diesen Wochenmittelwert zu berechnen. CurrencyType Transaction Rate Expr1 Mark 080.693 0,5600 Mark 081.393 0,5700 Mark 082.093 0,5800 0,57 Mark 082.793 0,5900 0,58 Mark 090.393 0.6000 0.59 Yen 080.693 0,0079 Yen 081.393 0,0082 Yen 082.093 0,0085 0,0082 Yen 082.793 0,0088 0,0085 Yen 090.393 0,0091 0,0088 RE: Moving Average Berechnung dhookom (Programmierer) 28 Jun 10 21:15 Wie alt ist dieser Code Es doesnt explizit verwenden DAO und nicht erwähnen, dass dies nicht mit verknüpften Tabellen arbeiten. Dim MyDB als DAO. Database, MyRST als DAO. Recordset. Ich würde eine Unterabfrage anstatt ein Re-Cord-Set verwenden. Es könnte etwa so aussehen: SELECT CurrencyType, Transaction, Rate (SELECT Avg (Rate) FROM Tabelle1 B WHERE A. CurrencyType B. CurrencyType UND A. TransactionDate ZWISCHEN B. TransactionDate - 14 UND B. TransactionDate) FROM Tabelle1 A RE: Umzug Durchschnittliche Berechnung Das ist wirklich perfekt. Ich schätze deine Hilfe sehr. Allerdings ist der Code, den Sie gaben die Berechnung der vorwärts 14 Tage gleitenden Durchschnitt (Platzierung der gleitenden Durchschnitt in den Datensatz für Tag 1 des Durchschnitts, wo ich wollte, dass es ein rückwärts gerichteter Durchschnitt, platziert in Rekord 14). Ich änderte nur etwas zu den folgenden und es scheint zu funktionieren SELECT A. CurrencyType, A. TransactionDate, A. Rate, (SELECT Avg (Rate) FROM Tabelle1 B WHERE A. CurrencyType B. CurrencyType UND B. TransactionDate ZWISCHEN A. TransactionDate - 14 AND A. TransactionDate) AS Expr1 FROM Tabelle1 AS Wie Sie sehen können, war alles, was ich tat Austausch A für B in der where-Klausel. Dies ist eine wirklich große Hilfe für mich und ich schätze es wirklich. Ich habe nicht gesehen Codierung wie diese vor, und ehrlich, ich nicht wirklich verstehen. Ich weiß nicht, wie die SQL versteht, was B und A sind. Ich gehe davon aus, dass sie eine Art von alternativen Verweis auf Tabelle1 erstellen. Wenn Sie irgendeine Anleitung geben können, würde ich es wirklich schätzen. Auch, vielleicht ein Hinweis auf Material, das ich sehen konnte bin ich immer sehr aufgeregt, um etwas Neues über VBASQL lernen, und ich wirklich schätzen Ihre Hilfe RE: Moving Average Calculation PHV (MIS) 29 Jun 10 12:22 versteht, was B und A Sind sie alias es RE: Moving Average Calculation Vielen Dank, PHV. Es macht besser Sinn bereits RE: Moving Average Berechnung joshery420 (TechnicalUser) 6 Jul 10 15:06 Wow, nie sah SQL-Sicht vor. Äußerst hilfreich. Ich versuche, diesen Code zu bekommen, um in meinem eigenen Datensatz zu funktionieren und ich bin auf eine bestimmte Frage geheilt. Pd2004, nicht sicher, ob der neue Unterabfrage-Code arbeitete die gleiche wie Ihre alten VBA-Code oder nicht, aber mit meinen Daten zeigt es immer noch den gleitenden Durchschnitt, auch wenn es arent genug Tage, um die Länge eines durchschnittlichen erstellen. z. B. Wenn Im einen 7-Tage-Rolling-Durchschnitt durchführt, zeigt Tag 1 dieselben Daten in der Spalte 7DayAvg wie in der Tagesdatenspalte an. Tag 2 würde zeigen, den Durchschnitt der Tage 1 und 2, etc. Einer von euch Jungs wissen, wie man dies durch Zufall zu beheben Auch danke für die große Code-Tipp PHV. RE: Verschieben der Mittelwertberechnung joshery420 (TechnicalUser) 6 Jul 10 15:08 Woops, gemeint zum Dank dhookom für den Code-Tipp, nicht PHV. Aber hey, danke euch beiden. XD RE: Moving Average Calculation Ich werde die besten Lösungen für die Fachleute hier verlassen, aber Sie können in meinem ursprünglichen Post sehen, wie das Microsoft-Hilfe-Beispiel versucht, das zu behandeln. Hier ist der Code: Wenn StartDate lt 8693 Dann MAvgs Null: Exit Function 8693 wird durch das früheste Datum der Daten in Ihrer Tabelle ersetzt. Sie sind nur verlassen die Funktion, wenn das Datum nicht die Kriterien passt. Ich weiß nicht, ob Sie so etwas in den Alias-Code von dhookem zur Verfügung stellen könnte. Ich dont wie ihre Art, dies zu behandeln, und ich vermute, dass dhookem wird eine viel elegantere Lösung. Für meine Zwecke die Frage, die Sie beschreiben, ist kein Problem, aber ich werde daran interessiert, alle Lösungen zu sehen. RE: Moving Average Berechnung Dhookom (Programmer) 6 Jul 10 17:05 Sie könnten versuchen, mit IIf (), um für eine Zählung der Anzahl der Datensätze zu testen. Achtung: es wird ein nicht getestetes Notepad-Code ausgeführt: SELECT A. CurrencyType, A. TransactionDate, A. Rate, IIF (SELECT Count (Rate) FROM Tabelle1 C WHERE A. CurrencyType C. CurrencyType AND C. TransactionDate BETWEEN A. TransactionDate - 14 AND A. TransactionDate), NULL) AS Expr1 FROM Tabelle1 AS A RE: Gleitende Durchschnittsberechnung

Comments