是否可以有效地模拟VBA中application.calculate的结果,而忽略易失性函数?

详情

定义:非易失性等效项:对于任何易失性工作簿,请将非易失性等效项定义为工作簿,其中所有具有易失性引用的单元格均已替换为其原始值。

定义:非易失性计算差异:假设我们有任何工作簿。现在,假设我们采用了非易失性等效项,并对此进行了完全重新计算。取其值以非易失性等效值更改的单元格及其值。这些是非易失性计算差异。

问题是在问这个。对于任何具有潜在易失性引用的工作簿,是否有办法仅有效地应用非易失性差异?效率是关键-这是我们要忽略易失性函数的全部原因-请参见下面的用例。因此,任何不能胜过完全重新计算的解决方案都是没有用的。

用例

我们有一本使用INDIRECT用法的工作簿。 INDIRECT是Excel原生的volatile函数。工作簿中大约有30万个,其中总共包含约150万个用过的单元。我们没有能力改变这些。由于这些INDIRECT用法,我们的工作簿需要很长时间才能重新计算。大约10秒钟。因此,我们已关闭了自动计算功能,并且用户会定期点击手动重新计算来刷新数据。

我们的业务用户对此表示满意,但是我们添加的某些新VBA功能可以使用比10秒等待更有效的方式。

到目前为止我们尝试过的


Sheet.Calculate-在某些情况下这很方便。而且我们确实使用它。但是它将所有其他工作表中的数据视为值,而不是公式。因此,如果有任何之字形引用,则不能提供完全一致的结果。例如。想象从图纸A->图纸B->图纸A的引用:那么将需要计算图纸A,然后是B,然后是A。之字形的数目是任意的。那只是一种情况,有两张纸。为了解决这个问题,实际上需要重写Excel的整个计算。

最佳答案

我想到的是一件事,这并不理想。也许您可以使自己的函数不可变,并存储在电子表格中,该函数将完全执行INDIRECT的功能(或使用的任何公式)。您可以将其称为INDIRECT2之类的东西,只需将其替换为电子表格中的函数即可。

不幸的是,该功能不适用于Application.WorksheetFunction.functionName,但是有很多解决方法。这只是我的一般想法。

10-08 13:18