使用结构化引用多次执行 UDF

UDF executing multiple times with Structured References

我遇到了大型(宽和长)table 的性能问题,它使用的 UDF 将变量作为结构化引用传递。

似乎当特定单元格的结构化引用(例如“[@A]”)传递给 UDF 时,它会将整个列(即“[A]”标记为脏并且列中的每个单元格重新计算 UDF 引用(这是性能问题的根源)。

我发现如果我将 table 中的 UDF 更改为使用单元格地址,例如“A2”,那么 UDF 仅在该单元格更改时执行。

要进行测试,请创建一个带有 debug.print 的简单函数,以便在 运行 时突出显示:

Public Function zap(a As Double, b As Double) As Double
    Debug.Print "zap: " & a & "+" & b
    zap = a + b
End Function

创建 3 列 table(A、B、C),C 列为“=zap([@A],[@B])”。如果您在 A 列或 B 列中输入或更改值,UDF 将针对每一行执行,而不管 row/column 交叉点中的值是否已更改。

如果您将 C 列更改为使用单元格寻址,例如“=zap(A2,B2)”,则 UDF 仅对已更改的行执行一次。

我可以使用单元格寻址来克服性能问题,但是使用带有结构化引用的 table 可以为这个应用程序带来很多好处。

我想知道我是否遗漏或误解了有关结构化引用的某些内容,或者是否对可以容纳的UDF进行了调整。

我在 C 列 =zap([@A],[@B]) 中使用了这个公式,正如您在下面的视频中看到的,我无法重现您的问题。它只是re-calculates行中的公式我改变了一些东西。

感谢 Rory - 在公式的开头放置 @ 有效:

=@zap([@A],[@B]) 

更新:

在实践中,我还发现如果任何因变量基于公式(例如,如果 [@A] 包含一个公式),那么这将需要在前面加一个“@”作为嗯

在我的情况下,依赖项太多,在 table 中的每个公式前放置一个“@”更容易(我的新 'rule' 使用 UDF 和表时).希望这对某人有所帮助。