我正在尝试在 vba 中编写移动平均线代码,但以下代码在各处返回相同的值。
Function trial1(a As Integer) As Variant
Application.Volatile
Dim rng As Range
Set rng = Range(Cells(ActiveCell.Row, 2), Cells(ActiveCell.Row - a + 1, 2))
trial1 = (Application.Sum(rng)) * (1 / a)
End Function
最佳答案
ActiveCell property 不属于 UDF,因为它发生了变化。有时,它甚至不在同一个工作表上。
如果您需要引用工作表上自定义 UDF 函数所在的单元格,请使用 Application.Caller 方法。 Range.Parent property 可用于显式标识 With ... End With statement 中的工作表(并避免进一步混淆)。
Function trial1(a As Integer) As Variant
Application.Volatile
Dim rng As Range
with Application.Caller.Parent
Set rng = .Range(.Cells(Application.Caller.Row, 2), _
.Cells(Application.Caller.Row - a + 1, 2))
trial1 = (Application.Sum(rng)) * (1 / a)
end with
End Function
您已应用 Application.Volatile 1 方法,但通过未明确指定父工作表,允许将范围平均为默认的 ActiveSheet property。
平均值是通过 Excel Application object 返回 SUM function 的结果和一些数学计算得出的。可以通过工作表的 AVERAGE function 在一个命令中返回相同的结果,但空白单元格的处理方式会有所不同。
trial1 = Application.Average(rng)
<小时/>
1 每当整个工作簿中的任何内容发生变化时, volatile 函数都会重新计算,而不仅仅是影响其结果的内容发生变化时。
关于vba - UDF 在任何地方都返回相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35910683/