我在Excel书中有一些用户定义的函数。我使用了一段时间但是,过了一会儿,我从单元格中删除了对这些函数的调用,因为我找到了一种更好的方法来完成相同的任务(我没有在VBA编辑器中删除函数定义本身)。因此,这些功能不再在书中也不会在任何VBA代码中被调用,我使用搜索检查它是100%肯定的。
现在我正在对我的代码进行一些检查,我注意到一些奇怪的事情:在同一工作簿中的Sub过程中(与这些函数无关)我调用了Application.CalculateFullRebuild
。当发生这种情况时,UDF会被调用,我可以通过在UDF中设置一个断点来看到它。
我想知道它为什么会发生以及可以采取哪些措施来避免它,因为它会不必要地减慢Sub的速度。
谢谢!
答案 0 :(得分:0)
系统正常运作。考虑:
Function qwerty() As String
qwerty = "qwerty"
MsgBox "XX"
End Function
它是非易失性的,没有参数。它将在工作表单元格中输入时计算。 Application.Calculate 可能会导致计算一次,:
Sub ytrewq()
Application.CalculateFullRebuild
End Sub
将在每次 ytrewq 运行时重新计算 UDF 。
答案 1 :(得分:0)
Application.CalculateFullRebuild
MSDN reference有这样说:
CalculateFullRebuild
方法类似于重新输入所有公式。 ... [运行时]执行所有打开的工作簿中的数据的完整计算,并重建依赖项。
使Excel重建依赖关系树和计算链
这意味着将重新计算模块代码或工作表代码中的任何UDF,因为Excel正在重建和测试依赖性和在计算链中使用的函数。
如果您正在寻找通过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
答案 2 :(得分:0)
到目前为止,我的方法一直在评论UDF中的所有代码,其中包括两个目标:一方面提高速度,另一方面检查是否有任何副作用。到目前为止,我没有观察到任何副作用,所以更多的是它们没有在任何地方使用。
目前我正在开发的应用程序工作得很好,但我会出于好奇而尝试你提出的解决方案。投注是在被隐藏和遗忘的地方使用,或者仅仅是我在工作簿结构中有一些垃圾没有得到清理。
谢谢!
第二天再次尝试,并且不再调用那些UDF。因此,我不得不假设当我重新启动它时,Excel会发生奇怪的事情。
无论如何,非常感谢Application.Caller的事情,我对此并不了解。