我想計算列的最後20個移動平均數。一個問題是列的某些單元格可能是空的,應該忽略它們。例如:在Excel中計算移動平均線
A
175
154
188
145
155
167
201
最後三位的移動平均值將是(155 + 167 + 201)/ 3。我試圖使用平均值,偏移量,索引來實現這一點,但我根本不知道如何。我對宏有點熟悉,所以這樣的解決方案可以正常工作:=MovingAverage(A1;3)
感謝您的任何提示或解決方案!
我想計算列的最後20個移動平均數。一個問題是列的某些單元格可能是空的,應該忽略它們。例如:在Excel中計算移動平均線
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}
輸入這個與控制+ shift +輸入使其成爲一個數組公式。這會找到最新的三個值。如果您需要更多或更少,請將公式中的兩個「3」實例更改爲任何您想要的。
LARGE((ROW($A$1:A9))*(NOT(ISBLANK($A$1:A9))),3+1)
該部分返回所有在你的例子,因爲行6,8有一個值,或5的單元的第四最高行號,和圖9是通過用一個值第三最高行中的第一。
(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。 TRUE轉換爲1,FALSE轉換爲零。這樣保留了SUM功能
=SUM({0;0;0;0;0;155;0;167;201})/3
因爲所有155以上的值都不滿足行號標準,所以乘以零。
只是一個快速的解決方案: 假設你的號碼都在單元格A2:A10,放在B10以下公式:
=IF(COUNT(A8:A10)=3,AVERAGE(A8:A10),IF(COUNT(A7:A10)=3,AVERAGE(A7:A10),"too many blanks"))
拖了你的移動平均
如果公式有是兩個連續你可以嵌套另一個IF空白,還不止這些的可能性,這種解決方案變得過於複雜
這可能有點太複雜,因爲有數百個值,可能有數十個或更多的空單元。不管怎麼說,還是要謝謝你! – 2011-03-13 12:23:43
我在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)成細胞。
歡迎任何評論。
這個腳本似乎計算自上而下的平均值。我想平均列的最後3個值。但我想我可以弄清楚如何。謝謝! – 2011-03-13 12:23:00
如果您打算使用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
感謝您提供完整的UDF! – 2011-03-13 21:09:11
聰明的解決方案。我喜歡你使用Row和Large。 +1 – momobo 2011-03-12 21:58:55
我修改了這個答案,我使用了一個公式,但遇到問題需要進一步尋找最後4個值中最低3個的平均值。我在這裏發佈了一個問題:http://stackoverflow.com/questions/22972920/moving-average-of-lowest-3-of-last-4-values – p0werenner 2014-04-09 20:06:38