gpt4 book ai didi

vba - 在 VBA 中使用 Solver 时如何关闭重新计算?

转载 作者:行者123 更新时间:2023-12-02 15:15:47 30 4
gpt4 key购买 nike

我尝试在工作表(例如工作表 A)上使用求解器。我在工作表 A 上还有一些带有“=rand()”的单元格,或者使用带有 Application.Volatile 的自定义函数来表示工作表上的任何公式 写在里面。我希望这些 volatile 单元格在我进行求解器时停止重新计算,因此我在求解器程序中使用了 Application.Calculation = xlCalculationManual ,但结果是在我运行求解器后,我发现那些 volatile 单元格细胞发生了变化。我哪里做错了?

最佳答案

有两种方法可以避免这种情况:

  1. 不要使用求解器!如果您编写自己的子程序来执行这些操作,则可以使用 Range.Calculate,而计算是手动的,仅计算此单元格(所有其他单元格将被忽略)。

  2. 更改公式并进行迭代选项 -> 公式 -> 启用迭代计算。现在使用保存 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com