vba - UDF 在任何地方都返回相同的值

标签 vba excel with-statement udf

我正在尝试在 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/

相关文章:

Java相当于python的 "with"

python - "with"语句中的变量范围?

python - pickle 和打开文件之间的区别?

arrays - VBA 变量/数组默认值

vba - 创建通用 Checkbox_Click VBA 代码

vba - 在 VBA 中设置长变量

performance - Excel:使用外部链接可以提高性能吗?

excel - 使用 FILTERXML 将字符串解析为表

excel - 从另一个工作簿选择表中获取数据的代码

excel - VBA 触发器输入或更新查找值