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

标签 vba excel

我尝试在工作表(例如工作表 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/

相关文章:

security - 我需要 VBA 库引用

vba - Excel 2013 工作簿在单独的 Excel 实例中通过链接进行通信

Python-在文件打开时读取Excel文件

vba - 从 Excel 功能区运行 Excel 加载项宏时出错

vba - Excel VBA 代码在 QC 测试用例中附加文件

excel - 如何让我的 VBA 项目引用 OneDrive 上的 Excel 工作簿以使用本地驱动器路径而不是 OneDrve URL 路径?

html - 使用 xsl 为 excel 生成 html 需要更多格式

vba - 展望 2013 VBA : store user defined settings

excel - VBA-如何在用户表单中基于文本框值的总和给出错误代码?

Excel VBA : Run-time error '438' Object doesn't support this property or method