【问题标题】:Excel Solver Ignoring Constraint in VBAExcel求解器忽略VBA中的约束
【发布时间】:2013-03-25 16:40:27
【问题描述】:

我正在尝试使用 Solver 找到一个简单投资组合的最大回报。在工作表中直接使用 Solver 是明智的,但是在 VBA 中设置命令时就不行了。相反(正如您从屏幕截图中看到的那样),它忽略了其中一个约束(在 T10 中计算的权重总和应该 = 1)。有趣的是,如果我将第三行改为:

SolverAdd CellRef:="$T$10", Relation:=2, FormulaText:="100"

或除“1”之外的任何其他整数。 (它也可能忽略了其他约束,但我无法检查)。 该表如下所示:

我的代码是:

Sub FindRange()

                SolverReset
                SolverOk SetCell:="$T$7", MaxMinVal:=1, ValueOf:="0", ByChange:="$O$10:$R$10"
                SolverAdd CellRef:="$T$10", Relation:=2, FormulaText:="1"
                SolverAdd CellRef:="$O$10:$R$10", Relation:=3, FormulaText:="0"
                SolverSolve UserFinish:=True
                SolverFinish KeepFinal:=1
                Range("T9").Value = Range("T7").Value
           End Sub

欢迎任何建议!

【问题讨论】:

  • 代码对我来说看起来不错。它似乎以相同的方式迭代非 VBA 与 VBA?也许尝试在SolverOK 之前添加CellRef
  • 也许尝试只使用FormulaText:=1? (没有双引号)我提到它是因为code on MSDN 不使用引号。
  • 谢谢。删除双引号确实有帮助(即它保持在 10 以下),但是它现在忽略了 "$O$10:$R$10" 应该等于 0。所以这两个约束都被忽略了
  • 它似乎可以在非 VBA 中工作
  • 重启 Excel 好像解决了....

标签: excel vba optimization constraints solver


【解决方案1】:

找到解决该错误的方法。对于标志“FormulaText:=1”。不要使用 1,而是使用对任何值为 1 的单元格的引用。

即,将“FormulaText:=1”更改为“FormulaText:=$H$5”,其中 $H$5 的值为 1

【讨论】:

  • 不幸的是,有时这仍然会失败。
【解决方案2】:

我认为只要值正好是 1,这里就有一个错误。其他帖子指出上述解决方案(将值放入单元格)是不可靠的。 我发现它不起作用,因为我的代码总是引用一个包含约束限制的单元格。 我的(粗略)解决方案是将限制值移动 10 ^ 12 或在适当方向上降低 1 部分,这会使约束变为 而不是 =。 所以而不是:

SolverAdd CellRef:=Range("SolverParam").Address, Relation:=3, _ FormulaText:=Range("SolverConstraint").value

用途:

SolverAdd CellRef:=Range("SolverParam").Address, Relation:=3, _ FormulaText:=Range("SolverConstraint").value + Abs(Range("SolverConstraint").value) * 1e-12

并为 Relation:=1 使用相反的符号

在这个简单的示例中,SolverParam 是要调整的单个单元格参数,SolverConstraint 是单个单元格的下限。

这是我可以预见的唯一一致的方法,可以统一处理所有值

进一步查找后,我从网上找到了另一个解决方案

FormulaText:="=" & Range("SolverConstraint").value

似乎工作可靠

【讨论】:

  • Relation:=2, FormulaText:1 更改为Relation:=2, FormulaText:="=1" 解决了我的问题。
【解决方案3】:

我遇到了完全相同的问题。我通过以下方式解决了它: 只需键入 FormulaText:=1,不带 1 的引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-09
    • 2016-11-04
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多