在执行CalculateFullRebuild时调用未使用的UDF

我在Excel书中有一些用户定义的函数。 我用了一段时间,但过了一段时间,我从单元中删除了对这些函数的调用,因为我find了一个更好的方法来完成相同的任务(我没有在VBA编辑器中删除函数定义本身)。 所以,这些函数不再被书中和任何VBA代码调用,我使用search来检查它是100%确定的。

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

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

谢谢!

Application.CalculateFullRebuild MSDN参考有这样的说法:

CalculateFullRebuild方法类似于重新input所有公式。 … [运行时]对所有打开的工作簿中的数据执行完整计算,并重新生成依赖关系。

进一步的MSDN参考指出:

导致Excel重新生成依赖关系树和计算链

这意味着模块代码或工作表代码中的任何UDF都将被重新计算,因为Excel正在重build和testing函数以便在计算链中进行依赖和使用。

如果您正在寻找一种方法来简单地通过您的Sub手动计算工作表中的现有公式,则可以使用“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 

系统正在运行。 考虑:

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

它是非易失性的,没有任何争论。 它将在工作表单元格中input时进行计算。 Application.Calculate可能会导致它被计算一次,但是:

 Sub ytrewq() Application.CalculateFullRebuild End Sub 

每次运行ytrewq都会导致UDF被重新计算。

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

现在我正在开发的应用程序工作得很好,但是我只是出于好奇才尝试你提出的解决scheme。 通过投注,无论是在隐藏和遗忘的地方使用,或者只是在工作簿结构中有一些垃圾没有得到清理。

谢谢!

更新

第二天又试了一次,那些UDF不再被叫了。 因此,我将不得不假定,Excel重新启动时出现了一些奇怪的事情。

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