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

Aas*_*han 3 excel vba excel-vba 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
Run Code Online (Sandbox Code Playgroud)

小智 6

ActiveCell属性,因为没有在UDF属于它的变化.有时,它甚至不在同一个工作表上.

如果需要在工作表中引用自定义UDF函数所在的单元格,请使用Application.Caller方法.该Range.Parent属性可以用来明确识别的工作表(并避免进一步的混乱)在用......结束与声明.

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
Run Code Online (Sandbox Code Playgroud)

您已应用Application.Volatile¹方法但允许通过不明确指定父工作表将范围平均为默认为ActiveSheet属性.

使用Excel Application对象计算平均值,返回SUM函数的结果和一些数学.使用工作表的AVERAGE函数可以在一个命令中返回相同的内容,但空白单元格的处理方式不同.

        trial1 = Application.Average(rng)
Run Code Online (Sandbox Code Playgroud)

¹ 当整个工作簿中的任何内容发生变化时,不仅在影响其结果的某些内容发生变化时,易失性函数都会重新计算.

  • 我做了同样的[这里](http://stackoverflow.com/questions/31472816/expanding-column-cells-for-each-column-cell/31594569#31594569)并且回复足以将另一个标记为'接受的答案'.这需要更多曝光; 它浪费了2天,这个话题很好,值得一个好的答案.(此外,我有很多代表,而且没有其他相关的事情) (3认同)