我尝试在工作表(例如工作表 A)上使用求解器。我在工作表 A 上还有一些带有“=rand()”的单元格,或者使用带有 Application.Volatile 的自定义函数来表示工作表上的任何公式
写在里面。我希望这些 volatile 单元格在我进行求解器时停止重新计算,因此我在求解器程序中使用了 Application.Calculation = xlCalculationManual
,但结果是在我运行求解器后,我发现那些 volatile 单元格细胞发生了变化。我哪里做错了?
最佳答案
有两种方法可以避免这种情况:
不要使用求解器!如果您编写自己的子程序来执行这些操作,则可以使用
Range.Calculate
,而计算是手动的,仅计算此单元格(所有其他单元格将被忽略)。更改公式并进行迭代选项 -> 公式 -> 启用迭代计算。现在使用保存 true/false(或 1/0 或其他)的辅助单元格,并更改您不想计算的公式,如下所示(辅助单元格 A1/公式 A2):
=IF(A1,A2,[your old formula])
这样只要A1为true
就会输出计算前的值。
据我所知,没有其他方法,因为求解器在每次测试新循环时都会进行计算
。
编辑:
拥有不需要始终保持 volatile 的 volatile UDF,您可以使用一个简单的技巧(再次需要辅助单元):
A1: [volatile function like =NOW() or =RAND()]
A2: =MY_UDF(A1)
在模块中:
Public Function MY_UDF(a As Variant) As Double
a = a
MY_UDF = Now
End Function
只要 A1 包含 volatile 的东西,你的 UDF 就会每次重新计算。但是,如果您清空 A1(或使其至少为非 volatile ),则提交给 UDF 的值将不再发生任何变化,这样 excel/vba 就会假设也不会发生任何变化,只需跳过它进行重新计算。这样,您还可以构建自己的 RAND
-UDF(当然名称不同),只要您的辅助单元是非 volatile 的,就可以停止工作簿中的所有 volatile 函数。
请注意:在将 A1(在本例中)设置为非 volatile 之后,之后的第一次计算仍将像 volatile 一样运行 1 次。另外,将 A1 从一个值更改为另一个值(如 0 更改为 1)也会运行一次。
关于vba - 在 VBA 中使用 Solver 时如何关闭重新计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36957154/