Ich möchte einen gleitenden Durchschnitt der letzten, sagen 20, Zahlen einer Spalte zu 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. Dieser 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. Rolling Average Table Im Folgenden werden wir ein Programm in Excel VBA, die 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 habe immer Bereichsreferenzen auf Arbeitsblättern für Berechnungen verwendet, aber jetzt fange ich an, Arrays zu verwenden, um mit Daten zu arbeiten, aufgrund dessen, wie viel schneller sie sein können. Ich werde mit Milliarden von Berechnungen zu tun haben, so muss ich so viel wie möglich in Erinnerung zu tun. Im bereitgestellten Code-Schnipsel versuche ich, SMAMINArray zu erhalten, um einen 50-Perioden-gleitenden Durchschnitt der vorhergehenden 50 Werte des Arrays mit dem Namen vArray zu berechnen. Wer weiß, wie es zu erreichen ist Hier ist, was ich bisher habe, und ich kann es nicht an die Arbeit. Die Summe (vArray (j, j49) 50) ist der Täter. Ich weiß, dass ist nicht richtig, aber ich brauchte, um eine Idee für jemanden mit mehr Array-Erfahrung als ich zu interpretieren, was ich eigentlich wollen. Ich weiß nicht, wie man dies in Summierung Elemente 1 bis 50 zu übersetzen und die Summe von 50 zu teilen. Und das zweite Element der SMAMINArray würde dann berechnen, den Durchschnitt der Elemente 2 bis 51 usw. Irgendwelche Ideen Hier ist ein Snippet von einigen Code Dass ich versucht habe: (Wenn Sie in Dallas leben, werde ich kaufen Sie ein Getränk Ihrer Wahl für Hilfe zu diesem Problem) fragte Mar 18 15 am 3:41 Das Makro unten zeigt, wie das Ergebnis zu erreichen, glaube ich, Sie suchen. Ich stellte Zelle A1 des Arbeitsblattes MoveAvg zu Rand () 1000 ein. Ich schleppte das unten zu Zelle A1500. Ich habe eine Paste Spezielle Werte nur für diesen Bereich, so dass die zufälligen Werte wurden behoben. Ich setze Cell C50 auf den Durchschnitt der Zellen A1: 50. Ich zog es. Ich lief das Makro unter dem ein Array mit den gleitenden Durchschnitten erstellt. Dieses Array wird in Spalte E beginnend bei Zeile 50 geschrieben. Das folgende Bild zeigt, dass die von Excel berechneten Werte mit denen übereinstimmen, die vom Makro berechnet wurden. Allerdings ist VBA nicht die Sprache zu verwenden, sind Sie durchführen Milliarden von Berechnungen. Ich beantwortete eine aktuelle Frage, die die Berechnung 8,063 Millionen Werte und schreibt sie auf die Festplatte mit 1 Million Werte pro Datei. Die Berechnung und Speicherung von 50 Millionen Werten mit VBA dauerte 13 Minuten, 15 Sekunden. Multiplizieren schlägt eine Gesamtzeit für alle 8,063 Millionen Werte von fast 14 Tagen, 20 Stunden. Mit VB. Net dauerte die Berechnung und Speicherung aller 8.063 Millionen Werte 51 Minuten. Lesen und Schreiben in eine Excel-Arbeitsmappe mit VB. Net ist langsamer, dass mit VBA. Aber sobald die Daten in VB. Net-Arrays, Berechnungen sind tausendmal schneller. VB. Net ist ein Upgrade von VBA, so dass die Lernkurve nicht steil ist. Die Express-Version von VB. Net ist kostenlos zum Download und Sie können alle Programme, die Sie schreiben, wenn Sie registrieren zu verteilen. Ich überlasse es Ihnen, darüber nachzudenken.
No comments:
Post a Comment