使用 UDF 的慢速宏、求解器和公式

Posted

技术标签:

【中文标题】使用 UDF 的慢速宏、求解器和公式【英文标题】:Slow Macro, Solver and Formulas with UDFs 【发布时间】:2017-09-26 06:50:44 【问题描述】:

我正在运行的 VBA 代码基本上是:

    将某些单元格设置为等于某些值 这些被输入到产生数字的模型中 求解器用于改变一个输入并获得最终的数字输出

循环数约为 150,不会太多。 这一切都发生在工作簿 2 中。计算发生在工作簿 1 中。 在工作簿 1 中,有相当多的单元格中包含用户定义的函数。总共大约 4000 个。

运行 VBA 代码时,整个过程需要一分钟多的时间才能完成。如果我删除工作表 1 中的数据(因为这个特定的宏不需要它),那么 VBA 代码只需要大约 5 秒。这很好。

有没有办法有效地关闭/锁定/忽略所有这些 UDF 单元,以免减慢宏的速度?只是那个范围的数据。我尝试过 ManualCalc Vs AutoCalc,但似乎没有做到这一点。

提前致谢

安东尼

【问题讨论】:

您可以将有问题的“工作表 1”排除到另一个工作簿中作为解决方法。 是的,这是最可能的选择,谢谢。唯一的问题是模型必须为每个工作簿更新数据。把它想象成工作表 1 中的“模型表”,它从外部程序中引入数据。然后工作表 2、3、4.. 是来自该数据的分析。如果我将工作表 1 拆分出来,我需要将外部数据带入多个工作簿,因为 Solver 我假设需要在同一个工作簿中引用某些内容。 【参考方案1】:

我的经验是,在使用求解器时,VBA 代码应仅限于工具调用。关闭 AutoCalc 不会做任何事情,因为求解器力计算当前正在考虑的场景。在我看来,您必须使用公式,因为它们的计算速度要快得多。

【讨论】:

Solver 实现了公式无法完成的任务。例如“Cellx 的值必须是 此处的复杂公式 = y。UDF 在工作表中但未由 Solver 使用。 只做一个模拟:将包含 UDF 的单元格转换为值,然后运行求解器。 然后在 Solver 完成后将它们全部转回..?并非所有单元格都具有相同的 UDF

以上是关于使用 UDF 的慢速宏、求解器和公式的主要内容,如果未能解决你的问题,请参考以下文章

从宏创建的数组公式的 UDF

z3求解器和求解器给出不同的结果

求解Haversine公式的分量时,sympy挂起[重复]

机器学习:PCA(使用梯度上升法求解PCA问题)

Excel技巧--使用规划求解

生成函数求解一般递推数列通项公式