Excel解算器忽略VBA中的约束

时间:2013-03-25 16:40:28

标签: excel vba optimization constraints solver

我正在尝试使用Solver找到简单投资组合的最大回报。在工作表中使用Solver可以直接合理地工作,但是在VBA中设置命令时则不会。相反(你可以从screengrab中看到)它忽略了一个约束(在T10中计算的权重之和应该= 1)。有趣的是,如果我改变第三行说:

,它的工作正常
SolverAdd CellRef:="$T$10", Relation:=2, FormulaText:="100"

或“1”以外的任何其他整数。   (它也可能忽略了其他约束,但我无法检查这一点)。 该表如下所示: enter image description here

我的代码是:

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

感谢任何建议!

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

我认为只要值正好为1,就会出现错误。其他帖子声明上述解决方案(将值放入单元格)是不可靠的。 我发现它不起作用我的代码总是引用一个持有约束限制的单元格。 我的(原始)解决方案是在适当的方向上将极限值在10 ^ 12或更低的位置移动1个部分,这使约束成为<或者>而不是< =或> =。 所以而不是:

SolverAdd CellRef:= Range(“SolverParam”)。地址,关系:= 3,_     FormulaText:=范围( “SolverConstraint”)值

使用:

SolverAdd CellRef:= Range(“SolverParam”)。地址,关系:= 3,_     FormulaText:=范围( “SolverConstraint”)值。  + Abs(范围(“SolverConstraint”)。值)* 1e-12

并使用相反的符号表示关系:= 1

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

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

进一步观察我发现了另一个来自网络的解决方案

FormulaText:=“=”&范围(“SolverConstraint”)。值

似乎可靠地工作

答案 2 :(得分:0)

我有完全相同的问题。我用以下方式解决了它: 只需输入FormulaText:= 1,不带引号为1.