簡體   English   中英

在Excel中計算移動平均線

[英]Calculate Moving Average in Excel

我想計算一個列的最后20個數字的移動平均值。 問題是列的某些單元格可能是空的,應該忽略它們。 例:

 A
175
154

188
145
155

167
201

最后三個的移動平均值為(155 + 167 + 201)/ 3。 我試圖用平均值,偏移量,索引實現這個,但我根本不知道如何。 我對宏有點熟悉,所以這樣的解決方案可以正常工作: =MovingAverage(A1;3)

感謝您的任何提示或解決方案!

{=SUM(($A$1:A9)*(ROW($A$1:A9)>LARGE((ROW($A$1:A9))*(NOT(ISBLANK($A$1:A9))),3+1)))/3}

使用control + shift + enter輸入,使其成為數組公式。 這將找到最新的三個值。 如果您想要更多或更少,請將公式中的兩個“3”實例更改為您想要的任何內容。

LARGE((ROW($A$1:A9))*(NOT(ISBLANK($A$1:A9))),3+1)

此部分返回具有值的所有單元格的第4個最高行數,或者示例中為5,因為行6,8和9是具有值的第1到第3個最高行。

(ROW($A$1:A9)>LARGE((ROW($A$1:A9))*(NOT(ISBLANK($A$1:A9))),3+1))

該部分基於行號是否大於第4個,返回9個TRUE或FALSE。

($A$1:A9)*(ROW($A$1:A9)>LARGE((ROW($A$1:A9))*(NOT(ISBLANK($A$1:A9))),3+1))

這將A1:A9中的值乘以9 TRUE或FALSE。 TRUEs轉換為1,FALSEs轉換為零。 這留下了這樣的SUM函數

=SUM({0;0;0;0;0;155;0;167;201})/3

因為155以上的所有值都不滿足行號標准,所以get乘以零。

如果要使用UDF,只有在參數包含要處理的所有數據范圍時,才會在更改數據時正確重新計算。

這是一個移動平均UDF,它處理整個列並包含一些錯誤處理。
您可以通過在單元格中輸入公式=MovingAverage(A:A,3)來調用它。

Function MovingAverage(theRange As Range, LastN As Long) As Variant
    Dim vArr As Variant

    Dim j As Long
    Dim nFound As Long
    Dim dSum As Double

    On Error GoTo Fail
    MovingAverage = CVErr(xlErrNA)
    '
    ' handle entire column reference
    '
    vArr = Intersect(Application.Caller.Parent.UsedRange, theRange).Value2

    If IsArray(vArr) And LastN > 0 Then
        For j = UBound(vArr) To 1 Step -1
            ' skip empty/uncalculated
            If Not IsEmpty(vArr(j, 1)) Then
                ' look for valid numbers
                If IsNumeric(vArr(j, 1)) Then
                    If Len(Trim(CStr(vArr(j, 1)))) > 0 Then
                        nFound = nFound + 1
                        If nFound <= LastN Then
                            dSum = dSum + CDbl(vArr(j, 1))
                        Else
                            Exit For
                        End If
                    End If
                End If
            End If
        Next j

        If nFound >= LastN Then MovingAverage = dSum / LastN

    End If
    Exit Function
Fail:
    MovingAverage = CVErr(xlErrNA)
End Function

只是一個快速的解決方案:假設您的數字在單元格A2:A10上,請在B10中輸入以下公式:

=IF(COUNT(A8:A10)=3,AVERAGE(A8:A10),IF(COUNT(A7:A10)=3,AVERAGE(A7:A10),"too many blanks"))

向上拖動公式即可獲得移動平均線

如果有兩個連續空白的可能性,你可以嵌套另一個,如果超過這個,這個解決方案變得太復雜了

我在VBA寫了一個簡短的腳本。 希望它能做你想要的。 這個給你:

Function MovingAverage(ByVal r As String, ByVal i As Integer) As Double
Dim rng As Range, counter As Long, j As Integer, tmp As Double
    Set rng = Range(r)
    counter = 360
    j = 0
    tmp = 0
    While j < i + 1 And counter > 0
        If Len(rng.Offset(j, 0)) > 0 Then
            tmp = tmp + rng.Offset(j, 0).Value
        End If
        j = j + 1
        counter = counter - 1
    Wend
    MovingAverage = CDbl(tmp / i)
End Function

1)我已設置360個單元格的限制。 這意味着該腳本不會查找超過360個單元格。 如果要更改它,請更改計數器的初始值。

2)腳本返回不是舍入平均值。 將最后一行更改為MovingAverage = Round(CDbl(tmp / i),2)

3)使用就像你想要的那樣,所以只需輸入= MovingAverage(“a1”; 3)到單元格中。

歡迎任何評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM