它是一种给我一个UDF计算移动平均数的奇怪。如果要在工作表中使用此UDF,我相信您会将其放在现有数据的旁边,并且如果要更改平均金额范围的大小,请手动更新它们?
假设你可以命名范围“MovingAverageSize”存储范围的大小来计算平均值,对现有数据的右平均量,考虑如下:
- 范围C2名为从B3存储
MovingAverageSize
- 数据和向下
- 移动平均结果被存储在数据的右列1
- 如果数据小于MovingAverageSize,所述SUM功能相应地调整
- 任何计算误差与结果在零
- 每次MovingAverageSize变化值时,它触发一个Sub更新式(代码放置在工作表对象中而不是普通模块)
- 或者,您可以更改代码以将MovingAverage放置到MovingAverageSize的同一列,以便您可以将几个不同的大小相互比较。
代码在工作表对象:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 Then
If Target.Address = ThisWorkbook.Names("MovingAverageSize").RefersToRange.Address Then UpdateMovingAverage Target
End If
End Sub
Private Sub UpdateMovingAverage(ByRef Target As Range)
Dim oRngData As Range, oRng As Range, lSize As Long, lStartRow As Long
Debug.Print "UpdateMovingAverage(" & Target.Address & ")"
If IsNumeric(Target) Then
lSize = CLng(Target.Value)
If lSize <= 0 Then
MsgBox "Moving Average Window Size cannot be zero or less!", vbExclamation + vbOKOnly
Else
' Top Data range is "B3"
Set oRngData = Target.Parent.Cells(3, "B") ' <-- Change to match your top data cell
lStartRow = oRngData.Row
' Set the Range to last row on the same column
Set oRngData = Range(oRngData, Cells(Rows.Count, oRngData.Column).End(xlUp))
Application.EnableEvents = False
For Each oRng In oRngData
If (oRng.Row - lSize) < lStartRow Then
oRng.Offset(0, 1).FormulaR1C1 = "=iferror(sum(R[" & lStartRow - oRng.Row & "]C[-1]:RC[-1])/MovingAverageSize,0)"
Else
oRng.Offset(0, 1).FormulaR1C1 = "=iferror(sum(R[" & 1 - lSize & "]C[-1]:RC[-1])/MovingAverageSize,0)"
End If
Next
Application.EnableEvents = True
Set oRngData = Nothing
End If
End If
End Sub
样本数据和截图
那么这里有什么问题? –
我的代码似乎不工作。它为所有单元格返回相同的值。如果我删除application.volatile行,我必须手动按下F2并输入每个单元格才能得到正确的答案。我认为原因是该功能无法识别动态范围有变化,但不知道如何解决。 –
我测试了它,它并没有在任何地方返回相同的值,它似乎做它应该做的。你的问题的问题是我们不知道你想要什么,我们应该参考你的代码来理解你在做什么。但是你的代码可能是错误的。 –