2016-09-12 8 views
0

このコードは単純な移動平均を計算するためのコードです。 C行の1から20までのダミー配列を作成しました。例えば、SMA(C7,3)=の平均を与えるべき関数を作成したいと思います。Excel-VBAでの単純な移動平均範囲

長い時間が経ってVBAに戻ってくると、以下のコードで何がエラーになるか分かりません。関数としてのセル名を使用して

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

サイズ変更の「0」を「1」に変更します。 offset()とは異なります。 –

+1

FYI、[この回答](http://stackoverflow.com/a/38873678/4088852)では、関数の名前を変更するよう勧告されている理由を説明しています。 – Comintern

答えて

2
  1. 避けは
  2. RESIZE()
  3. 内部レンジ可変


機能のSmaI(範囲としてRNG、Nように使用される固定しました整数)バリアントとして Dim rng2 As範囲 セットrng2 = rng.Reサイズ(N、1) のSmaI = Application.WorksheetFunction.Average(RNG2) エンド機能

EDIT#1:スコットさんのコメントに基づいて

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 **ありがとうございました** –

0

私はあなたを想定列を横に並べてSMAにしてください(下記参照):

enter image description here

その場合、以下のことを行いますと、それはあなたの一番下の列C列にそれを自動補完ドラッグ:

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

ちょうどFYIこれは、既存の式で行うことができます。

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

E1に含める行数が含まれています。

enter image description here

関連する問題