2016-09-12 2 views
0

Dieser Code dient nur dazu, den einfachen gleitenden Durchschnitt zu berechnen. Eröffnete eine Excel, erstellt Dummy-Array in C-Zeile von 1 bis 20. Ich möchte eine Funktion für zB erstellen: SMA (C7,3) =, die Durchschnitt von C5: C7 geben sollte.Einfacher gleitender Durchschnitt in Excel-VBA

Zurück zu VBA nach langer Zeit, nicht in der Lage, herauszufinden, was der Fehler in der folgenden Code ist.

Function sma1(rng As Range, N As Integer) 
Set rng = rng.Resize(-N + 1, 0) 
sma1 = Application.WorksheetFunction.average(rng) 
End Function 
+1

Ändern der '0' in der Größe ändern, um '1'. Es ist anders als offset(). –

+1

Nur zur Kenntnisnahme, [diese Antwort] (http://stackoverflow.com/a/38873678/4088852) veranschaulicht den Grund, warum Sie Empfehlungen erhalten, um Ihre Funktion umzubenennen. – Comintern

Antwort

2
  1. vermeiden, einen Zellennamen als Funktion
  2. Verwendung fixiert die RESIZE()
  3. eine interne Bereichsvariable verwendet


Funktion Smal (RNG als Strecke, N Wie Integer) als Variante Dim rng2 als Bereich Set rng2 = rng.Re Größe (N, 1) Smal = Application.WorksheetFunction.Average (RNG2) End Function

EDIT # 1:

Basierend auf Scott Kommentar:

Function smal(rng As Range, N As Integer) As Variant 
    Dim rng2 As Range 
    Set rng2 = rng.Offset(1 - N, 0).Resize(N, 1) 
    smal = Application.WorksheetFunction.Average(rng2) 
End Function 
+1

@ScottCraner ** Danke ** –

0

ich Sie davon ausgehen, Willst du die Spalte entlang der Seite geben Sie SMA (wie unten gezeigt?):

enter image description here

Wenn ja, das unten wird es und ziehen Sie es an die Unterseite Sie Spalte C-Array automatisch vervollständigt:

Sub SMA3() 
    Range("D7").FormulaR1C1 = "=AVERAGE(R[-2]C[-1]:RC[-1])" 'This is a relative reference (left one cell and up two cells) - This give your three inputs 
    Range("D7").AutoFill Destination:=Range("D7:D" & Range("C1048576").End(xlUp).Row) 'Autofills the SMA 
End Sub 
0

Nur ein FYI kann dies mit bestehenden Formel erfolgen:

=IF(ROW(C1)<$E$1,"",AVERAGE(INDEX(C:C,ROW(C1)-$E$1+1):C1)) 

E1 enthält die Anzahl der Zeilen, die eingeschlossen werden sollen.

enter image description here

Verwandte Themen