Thursday, November 17, 2016

Bewegliches Array Vba

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. Ich möchte einen gleitenden Durchschnitt der letzten, sagen wir 20, Zahlen einer Spalte berechnen. Ein Problem ist, dass einige Zellen der Spalte leer sein können, sie sollten ignoriert werden. Beispiel: Ein gleitender Durchschnitt der letzten drei wäre (155167201) / 3. Ive versucht, dies zu implementieren mit Mittelwert, Offset, Index, aber ich weiß einfach nicht, wie. Im ein wenig vertraut mit Makros, so würde eine solche Lösung gut funktionieren: MovingAverage (A13) Vielen Dank für alle Tipps oder Lösungen Geben Sie dies mit Controlshiftenter, um es eine Matrix-Formel. Hier finden Sie die letzten drei Werte. Wenn Sie mehr oder weniger wollen, ändern Sie die beiden Instanzen von 3 in der Formel, was auch immer Sie wollen. Dieses Teil gibt die 4. höchste Zeilennummer aller Zellen zurück, die einen Wert haben, oder 5 in Ihrem Beispiel, da die Zeilen 6, 8 und 9 die 1. bis 3. höchsten Zeilen mit einem Wert sind. Dieser Teil gibt 9 TRUEs oder FALSEs zurück, basierend darauf, ob die Zeilennummer größer als die 4. größte ist. Diese multipliziert die Werte in A1: A9 mit diesen 9 WAHREN oder FALSE. TRUEs werden in 1 und FALSEs auf null konvertiert. Dies lässt eine SUM-Funktion wie folgt Da alle Werte über 155 nicht das Zeilennummerkriterium erfüllen, wird das Get mit Null multipliziert. Ich habe ein kurzes Skript in VBA geschrieben. Hopefull es tut, was Sie wollen. Hier sind Sie: 1) Ich habe Limit auf 360 Zellen gesetzt. Es bedeutet, dass das Skript nicht mehr als 360 Zellen suchen. Wenn Sie sie ändern möchten, ändern Sie den Anfangswert des Zählers. 2) Das Skript gibt nicht gerundeten Durchschnitt zurück. Ändern Sie die letzte Zeile in MovingAverage Round (CDbl (tmp / i), 2) 3) Die Verwendung ist genau wie Sie wollten, so geben Sie einfach MovingAverage (a13) in die Zelle. Alle Kommentare sind willkommen. Hier ist ein Code, der hilfreich sein sollte für diejenigen, die technische Analyse im Handel und wollen Strategien in Excel zu testen. 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 den gleitenden Durchschnitt zu markieren. Fügen Sie zwei Schaltflächen hinzu: Name: buttonSenden, Beschriftung: 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 Einfache. AddItem Weighted. AddItem Exponential End With MAForm. Show End Sub Unten ist der Code auf die Schaltfläche zum Senden zugeschrieben. Private Sub buttonSubmitClick () Dim inputRange, outputRange As Range Die inputRange den Preis Serie enthalten verwendet zur Berechnung der MAs und der outputRange mit den gleitenden Durchschnitten Werten gefüllt werden. Dim inputPeriod As Integer Der gleitende Durchschnittszeitraum wird deklariert. Dim inputAddress, outputAddress As String Die als String deklarierten Eingabe - und Ausgabebereiche. Wenn comboTypeMA. Value Exponential ltgt Und comboTypeMA. Value ltgt einfach und comboTypeMA. Value ltgt gewichteten True Then MsgBox Bitte wählen Sie einen gleitenden Durchschnitt aus der Liste. RefInputRange. SetFocus Exit Sub Dieser Teil des Verfahrens, erzwingt die ersten Einschränkungen die eingereichten Daten zu. Wenn der gleitende Durchschnitt Typ wird nicht in der Dropdown-Liste enthalten ist, wird das Verfahren nicht mit dem nächsten Schritt fortfahren, und der Benutzer wird aufgefordert, es erneut zu wä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 den gleitenden Durchschnitt Zeitraum. RefInputPeriod. SetFocus Exit Sub ElseIf Nicht IsNumeric (RefInputPeriod. Value) Then MsgBox durchschnittliche Dauer Umzug 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 MsgBox Dann Ausgangsbereich eine unterschiedliche Anzahl von Zeilen als der Eingangsbereich hat. 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 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 If Eine weitere Einschränkung 8211 hinzugefügt wird Der Eingangsbereich muss einen gleichen oder höheren Betrag von Elementen als die Periode haben. Wenn inputPeriod lt 0 Then durchschnittliche Dauer MsgBox bewegen höher als 0 RefInputPeriod. SetFocus Exit Sub End sein muss, wenn der gleitende Durchschnitt Zeitraum muss höher als Null sein. ReDim outputarray (inputPeriod To RowCount) Als Variant werden auch die Array-Dimensionen von outputarray bestimmt. Die untere Grenze des Arrays ist die inputPeriod Wert und die obere Grenze ist, den Wert RowCount (die Anzahl der Elemente in dem 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 output (i) Next i outputRange. Cells (0, 1).Value SMA (amp inputPeriod amp) Grundsätzlich berechnet die Prozedur den gleitenden Durchschnitt der letzten x Zahlen (x zum inputPeriod entspricht), mit dem Element Start Des Eingangsarrays gleich der inputPeriod. Unten ist ein vereinfachtes Beispiel, das jeden Schritt des Verfahrens zeigt. In diesem Beispiel gibt es vier Zahlen (NO01, no02, No03 und no04) aus Reihe 1 bis 4 und der gleitende Durchschnitt Zeitraum zu rudern ist 3. Nach jeder neuen gleitenden Durchschnitt berechnet wird, jede Zelle des outputRange wird der Wert aus dem nehmen Ausgabearray. Und nachdem alle gleitenden Durchschnitte berechnet werden, in der Zelle oben outputRange wird ein Titel eingefügt werden, um den gleitenden Durchschnitt Art und Zeit enthält. Dieser nächste Teil wird den exponentiellen gleitenden Durchschnitt berechnen. EMA ------------------------------------------ ElseIf comboTypeMA. Value Exponential Dann Dim alpha As Double-alpha-2 / (inputPeriod 1) Für j 1 Um inputPeriod Temp Temp inputarray (j) Next j output (inputPeriod) temp / inputPeriod Zuerst 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. Für i inputPeriod 1 Um RowCount output (i) output (i - 1) alpha (inputarray (i) - output (i - 1)) Next i mit dem zweiten gleitenden Durchschnitt starten, werden sie auf der Grundlage der obigen Formel berechnet werden: die previous EMA und alpha von der Differenz zwischen der aktuellen Zahl aus der inputarray und dem vorherigen EMA Wert multipliziert. 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 verwendet für Die 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 Ende SubThread: VBA Moving Average Berechnung VBA Moving Average Berechnung Ich hoffe, dass ich das richtig mache - ich habe ein wenig Hintergrundinformationen in mein Problem im Voraus und die Codierung wurde unten aufgelistet. Ich habe hundert Aktienkurse erhalten, und ich bin verpflichtet, VBA verwenden, um eine Zehn-Tage-Simple Moving Average für diese Serie von Aktienkursen zu schaffen. Die Beobachtungen beginnen von der Zeit 0 bis t 100, und die Beobachtungen beginnen von t 9 das Programm erfordert natürlich zehn Aktienkurse, um den Durchschnitt zu erzeugen. Für jeden neuen Tag fällt der älteste Aktienkurs ab und der nächstfolgende Aktienkurs wird verwendet - daher ändert sich die Berechnung täglich. Was ich getan habe, ist der Bereich der Zellen. StockPrice bezieht sich auf die ursprünglichen Daten und MovingAverage bezieht sich auf die Daten, an die Daten ausgegeben werden. Ich habe dann einige Formeln erstellt, um den Durchschnitt zu berechnen und zeigen sie in der Moving Average Bereich der Zellen. Bitte beachten Sie den beigefügten Code für weitere Referenz: Ich habe ein Problem, wenn ich meinen Code ausführen. Es gibt keine Fehler, aber meine Ausgabe im Ergebnis MovingAverage Bereich zeigt nur 0 für den gesamten Bereich, im Gegensatz zu den richtigen durchschnittlichen Aktienkurse. Ich glaube, ich habe einen Schritt zwischen Next y und For i 1 To numRowb, ​​gegen Ende der Codierung verpasst, aber ich bin nicht 100 sicher, wie meine VBA-Kenntnisse ist minimal. Re: VBA Moving Average Calculation Wenn dies eine Aufgabe ist, werde ich Ihnen helfen, aber ich werde es nicht für Sie schreiben. Das erste, was Sie tun müssen, ist einige Werte in ein Array. Sobald Sie die Werte im Array haben, müssen Sie dann eine Logik verwenden, um den gleitenden Durchschnitt zu berechnen. Dieser Code findet die letzte Zeile in Spalte B, also das Ende des Wertebereichs, mit dem Sie arbeiten müssen. Ich habe einen Bereich namens stockValue deklariert und ein Array namens StockPrice deklariert. Also mit dem Code über den Werten in Spalte B sind jetzt in einem Array - der erste Wert des Arrays ist StockPrice (1,1), der zweite Wert des Arrays ist StockPrice (2,1). Ich finde es schneller, dies zu tun, aber leider schafft es eine 2-dimensionale Array (wenn Sie nur ein eindimensionales Array benötigen). Sie könnten es ein 1-dimensionales Array von In diesem Fall StockPrice (0) ist das erste Element des Arrays und so weiter - macht ein Array mit dem letzten Wert stockPrice (100) Das wird zumindest die Werte in das Array - Sie müssen Um über die Logik nachzudenken, die jetzt benötigt wird, um einen gleitenden Durchschnitt zu berechnen. Wie gesagt, ich werde helfen, aber werde es nicht für Sie schreiben. PS: 2 Dinge sollten auch in Ihrem Code. Option Explizit über dem Unternamen - müssen Sie alle Variablen deklarieren. Zweitens sollten Sie einen Fehler-Handler haben, um mit potenziellen Fehlern im Code / workbook Good Luck befassen. Ich melde mich für die Nacht ab, aber ich werde deine Fortschritte morgen überprüfen. Wenn einer der Gurus wollen Ihnen helfen oder Kritik mein Code - es gibt da Grüße Anthony 8203 820382038203 Sie haben Ihren Weg. Ich habe meinen Weg. Wie für den richtigen Weg, den richtigen Weg, und der einzige Weg, es ist nicht vorhanden. Wie Berechnung der gleitenden Mittelwerte in Excel Excel-Datenanalyse für Dummies, 2nd Edition Der Data Analysis-Befehl bietet ein Werkzeug für die Berechnung der Bewegung und exponentiell geglättete Mittelwerte in Excel. Nehmen Sie an, um zu veranschaulichen, dass Sie tägliche Temperaturinformationen gesammelt haben. Sie wollen den dreitägigen gleitenden Durchschnitt 8212 den Durchschnitt der letzten drei Tage 8212 als Teil einer einfachen Wettervorhersage berechnen. Gehen Sie folgendermaßen vor, um die gleitenden Mittelwerte für diesen Datensatz zu berechnen. Um einen gleitenden Durchschnitt zu berechnen, klicken Sie zuerst auf die Schaltfläche Data tab8217s Data Analysis. Wenn Excel das Dialogfeld Datenanalyse anzeigt, wählen Sie aus der Liste den Eintrag Moving Average aus, und klicken Sie dann auf OK. Excel zeigt das Dialogfeld "Gleitender Durchschnitt" an. Identifizieren Sie die Daten, die Sie verwenden möchten, um den gleitenden Durchschnitt zu berechnen. Klicken Sie im Dialogfeld "Gleitender Durchschnitt" in das Eingabebereichsfeld. Identifizieren Sie dann den Eingabebereich, indem Sie entweder eine Arbeitsbereichsadresse eingeben oder mit der Maus den Arbeitsbereich auswählen. Ihre Bereichsreferenz sollte absolute Zellenadressen verwenden. Eine absolute Zellenadresse steht vor dem Spaltennamen und der Zeilennummer mit Vorzeichen, wie in A1: A10. Wenn die erste Zelle in Ihrem Eingabebereich eine Textbeschriftung enthält, um Ihre Daten zu identifizieren oder zu beschreiben, aktivieren Sie das Kontrollkästchen Labels in First Row. Erklären Sie im Textfeld Interval, wie viele Werte in die gleitende Durchschnittsberechnung einbezogen werden sollen. Sie können einen gleitenden Durchschnitt mit einer beliebigen Anzahl von Werten berechnen. Standardmäßig verwendet Excel die letzten drei Werte, um den gleitenden Durchschnitt zu berechnen. Um festzulegen, dass eine andere Anzahl von Werten zur Berechnung des gleitenden Durchschnitts verwendet werden soll, geben Sie diesen Wert in das Textfeld Intervall ein. Sagen Sie Excel, wo die gleitenden Durchschnittsdaten platziert werden sollen. Verwenden Sie das Textfeld Ausgabebereich, um den Arbeitsblattbereich zu identifizieren, in dem Sie die gleitenden Durchschnittsdaten platzieren möchten. In dem Arbeitsblattbeispiel wurden die gleitenden Durchschnittsdaten in den Arbeitsblattbereich B2: B10 platziert. (Optional) Geben Sie an, ob ein Diagramm gewünscht wird. Wenn Sie ein Diagramm möchten, das die gleitenden Durchschnittsinformationen darstellt, aktivieren Sie das Kontrollkästchen "Diagrammausgabe". (Optional) Geben Sie an, ob Standardfehlerinformationen berechnet werden sollen. Wenn Sie Standardfehler für die Daten berechnen möchten, aktivieren Sie das Kontrollkästchen Standardfehler. Excel legt Standardfehlerwerte neben den gleitenden Mittelwerten fest. (Die Standardfehlerinformationen gehen zu C2: C10.) Nachdem Sie die Angabe, welche gleitenden durchschnittlichen Informationen Sie berechnen lassen möchten und wo Sie sie platzieren möchten, klicken Sie auf OK. Excel berechnet gleitende Durchschnittsinformationen. Hinweis: Wenn Excel doesn8217t über genügend Informationen verfügt, um einen gleitenden Durchschnitt für einen Standardfehler zu berechnen, legt er die Fehlermeldung in die Zelle. Sie können mehrere Zellen sehen, die diese Fehlermeldung als einen Wert anzeigen.


No comments:

Post a Comment