Wednesday 29 November 2017

Moving Average Vba Code


Gleitender Durchschnitt Berechnung Gleitender Durchschnitt Berechnung Gleitender Durchschnitt 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üsseldatentyp: Textfeldgröße: 25 Feldname: TransactionDate Primärschlüsseldatentyp: Datum / Uhrzeit Format: Kurzdatum Feldname: Rate Datentyp : Währung Dezimalstellen: 4 Zeigen Sie die Tabelle in der Datenblattansicht an und geben Sie die folgenden Werte ein: CurrencyType TransactionDate Rate ----------------------------- --------------- Yen 8/6/93 0,0079 Yen 8/13/93 0,0082 Yen 8/20/93 0,0085 Yen 8/27/93 0,0088 Yen 9/3/93 0,0091 Markieren Sie ein neues Modul und geben Sie die folgenden Funktionen ein: Funktion MAvgs (Perioden As Integer, StartDate, TypeName) Dim MyDB als DATENBANK, MyRST als Recordset, MySum als doppelt dim i, x gesetzt MyDSTDD () Set MyRST MyDB. OpenRecordset (Tabelle1) Ein Fehler wird wieder aufgerufen MyRST. Index PrimaryKey x Perioden - 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 8/6/93 Dann wird MAvgs Null: Exit Function 8/6/93 durch das früheste Datum der Daten in Ihrer Tabelle ersetzt. MySum Store (i) MySum Weiter i MAvgs MySum / Perioden MyRST. Close End Function 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. Währungstyp Transaktionscode Expr1 Kennzeichen 08/06/93 0,5600 Mark 13/13/93 0,5700 Mark 08/20/93 0,5800 0,57 Mark 27.08.93 0,5900 0,58 Mark 09/03/93 0,6000 0,59 Yen 08/06/93 0,0079 Yen 08/13/93 0.0082 Yen 08/20/93 0,0085 0,0082 Yen 08/27/93 0,0088 0,0085 Yen 09/03/93 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 doesnt erwähnen, dass dies nicht mit verknüpften Tabellen zu arbeiten. Dim MyDB als DAO. Database, MyRST als DAO. Recordset. Ich würde eine Unterabfrage anstatt ein Re-Cord-Set verwenden. Es könnte so aussehen: SELECT CurrencyType, TransactionDate, Rate, (SELECT Durchschnitt (Rate) FROM Tabelle1 B WHERE A. CurrencyType B. CurrencyType UND A. TransactionDate BETWEEN B. TransactionDate - 14 UND B. TransactionDate) FROM Tabelle1 A RE: Verschieben 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 einige Verweis auf Material, das ich sehen konnte bin ich immer sehr aufgeregt, um etwas Neues über VBA / SQL, 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 sind 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: If StartDate lt 8/6/93 Dann wird MAvgs Null: Exit Function 8/6/93 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 folgen: SELECT A. CurrencyType, A. TransactionDate, A. Rate, IIF (SELECT Count (Rate) FROM Tabelle1 C WHERE A. CurrencyType C. CurrencyType UND C. TransactionDate ZWISCHEN A. TransactionDate - 14 AND A. TransactionDate), NULL) AS Expr1 FROM Tabelle1 AS A RE: Moving Average CalculationRolling (Transaktionsdatensatz), ausgedrückt als SELECT-Wert (Rate) FROM Tabelle1 B WHERE A. CurrencyType B. CurrencyType UND B. TransactionDate ZWISCHEN A. TransactionDate - 14 UND A. TransactionDate) Durchschnittliche Tabelle Im folgenden betrachten wir ein Programm in Excel VBA, das eine rollende durchschnittliche Tabelle verursacht. 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 Weil 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. Das bedeutet, dass das Skript nicht mehr als 360 Zellen sucht. 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. Kommentare sind willkommen.

No comments:

Post a Comment