是否可以从VBA有效地模拟application.calculate
的结果,而忽略易失函数?
定义:非易失性等效项:对于任何易失性工作簿,请将非易失性等效项定义为工作簿,其中所有具有易失性引用的单元格均已替换为其原始值。
定义:非易失性计算差异:假设我们有任何工作簿。现在,假设我们采用了非易失性等效项,并对此进行了完全重新计算。取其值以非易失性等效值更改的单元格及其值。这些是非易失性计算差异。
问题是在问这个。对于任何具有潜在易失性引用的工作簿,是否有办法仅有效地应用非易失性差异?效率是关键-这是我们要忽略易失性函数的全部原因-请参见下面的用例。因此,任何不比完全重新计算都要好的解决方案都是没有用的。
我们有一本使用INDIRECT
的工作簿。 INDIRECT
是Excel的volatile函数。工作簿中大约有30万个,其中总共包含约150万个用过的单元。我们没有能力改变这些。由于这些INDIRECT
的使用,我们的工作簿需要很长时间才能重新计算。大约10秒钟。因此,我们已关闭了自动计算功能,并且用户会定期点击手动重新计算来刷新数据。
我们的业务用户对此表示满意,但是我们添加的某些新VBA功能可以使用比10秒等待更有效的功能。
Sheet.Calculate
-在某些情况下这很方便。而且我们确实使用它。但是它将所有其他工作表中的数据视为值,而不是公式。因此,如果有任何之字形引用,则不能提供完全一致的结果。例如。想象从图纸A->图纸B->图纸A的引用:那么将需要计算图纸A,然后是B,然后是A。之字形的数目是任意的。那只是一种情况,有两张纸。为了解决这个问题,实际上需要重写Excel的整个计算。答案 0 :(得分:2)
我想到一件事,这并不理想。也许您可以使自己的函数不可变,并存储在电子表格中,该函数将完全执行INDIRECT的功能(或使用的任何公式)。您可以将其称为INDIRECT2之类的东西,然后将其替换为电子表格中的功能。
不幸的是,Application.WorksheetFunction.functionName
无法使用此功能,但是有很多解决方法。这只是我的一般想法。
答案 1 :(得分:1)
使用与INDIRECT
相同功能的非易失性用户定义函数吗?
Public Function INDIRECT_NV(ByVal ref_text As String, Optional ByVal a1 As Boolean) As Variant
'Non-volatile INDIRECT function
'Does not accept R1C1 notation - the optional is purely for quick replacement
INDIRECT_NV = CVErr(xlErrRef) 'Defaults to an error message
On Error Resume Next 'If the next line fails, just output the error
Set INDIRECT_NV = Range(ref_text) 'Does the work of INDIRECT, but not for R1C1
End Function
或者,根据使用情况,可能可以使用INDEX
和MATCH
(非易失性函数)代替INDIRECT
查询