执行 CalculateFullRebuild 时调用未使用的 UDF

Unused UDF being called when doing CalculateFullRebuild

我在 Excel 一本书中有一些用户定义的函数。我使用了一段时间,但过了一会儿,我从单元格中删除了对这些函数的调用,因为我找到了完成相同任务的更好方法(我没有删除 VBA 中的函数定义本身编辑)。因此,无论是在书中还是从任何 VBA 代码中都不再调用这些函数,我使用搜索进行了检查以确保 100% 确定。

现在我正在检查我的代码,我注意到一些奇怪的事情:在同一个工作簿(与这些函数无关)的 Sub 过程中我调用了 Application.CalculateFullRebuild。当发生这种情况时,那些 UDF 被调用,我可以通过在 UDF 内设置一个断点来查看它。

我想知道为什么会发生这种情况以及可以采取什么措施来避免这种情况,因为它不必要地减慢了 Sub。

谢谢!

系统正常工作。考虑:

Function qwerty() As String
    qwerty = "qwerty"
    MsgBox "XX"
End Function

它是非易失性的,没有参数。它将在输入工作表单元格时进行计算。 Application.Calculate可能会导致计算一次,然而:

Sub ytrewq()
    Application.CalculateFullRebuild
End Sub

将导致每次 ytrewq 为 运行.

时重新计算 UDF

Application.CalculateFullRebuild MSDN reference 有话要说:

The CalculateFullRebuild method is similar to re-entering all formulas. ... [When run] a full calculation of the data in all open workbooks is performed and the dependencies are rebuilt.

Further MSDN reference 状态:

Causes Excel to rebuild the dependency tree and the calculation chain

这意味着模块代码或 sheet 代码中的任何 UDF 都将被重新计算,因为 Excel 正在重建和测试函数的依赖性和在计算链中的使用。

如果您正在寻找一种通过 Sub 简单地手动计算 sheet 中现有公式的方法,您可以使用 'Application.Calculate' (MSDN):

Application.Calculate 'for all open Sheets
Sheets("Name of Sheet").Calculate 'Specific Sheet
Sheets("Name of Sheet").Range("Name of Range").Calculate 'Specific Range

目前我的方法是注释 UDF 中的所有代码,目的有两个:一方面提高速度,另一方面检查是否有任何副作用发生。到目前为止,我还没有观察到任何副作用,更重要的是它们没有在任何地方使用。

目前,我正在开发的应用程序运行良好,但出于好奇,我会尝试您提出的解决方案。赌注是它在某个隐藏和被遗忘的地方使用,或者只是我在工作簿结构中有一些垃圾没有被清理。

谢谢!

更新

第二天再次尝试,那些 UDF 不再被调用。因此,我不得不假设 Excel 发生了一些奇怪的事情,当我重新启动它时它消失了。

无论如何,非常感谢 Application.Caller 的事情,我不知道。