应用程序从VBA计算 - 忽略易失性函数

问题描述 投票:3回答:2

Question

是否有可能从VBA有效地模拟application.calculate的结果,但忽略了易失性函数?

Detail

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

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

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

Use Case

我们有一本充满INDIRECT用法的工作簿。 INDIRECT是一个Excel本地的易失性函数。工作簿中大约有300,000个,其中包含大约150万个使用过的单元格。我们没有能力改变这些。由于这些INDIRECT用法,我们的工作簿需要很长时间才能重新计算。大约10秒。因此,我们关闭了自动计算,用户定期点击手动重新计算以刷新数据。

我们的业务用户很好,但我们添加的一些新的VBA功能可以使用比10秒等待更高效的东西。

我们迄今为止所做的一切

  • Sheet.Calculate - 在某些情况下这很方便。我们确实使用它。但它将所有其他工作表中的数据视为值,而不是公式。因此,如果存在任何锯齿形参考,则不能提供完全一致的结果。例如。想象一下表A的参考 - >表B - >表A:然后需要计算表A,然后是B,然后是A. Z字形的数量是任意的。这只是一个案例,有两张。要解决这个问题,需要基本上重写Excel的整个计算。
excel vba excel-formula volatile calculation
2个回答
2
投票

有一件事在我脑海中浮现,并不理想。也许你可以创建自己的函数,它不是易变的并且存储在电子表格中,这将完成INDIRECT所做的(或者你使用的任何公式)。您可以将其称为INDIRECT2或其他东西,只需在电子表格中替换它们即可。

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


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

或者,根据用例,可以使用INDEXMATCH(非易失性函数)来替换INDIRECT查询

© www.soinside.com 2019 - 2024. All rights reserved.