我正在尝试使用Solver找到简单投资组合的最大回报。在工作表中使用Solver可以直接合理地工作,但是在VBA中设置命令时则不会。相反(你可以从screengrab中看到)它忽略了一个约束(在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
感谢任何建议!
答案 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.