Excel求解器忽略VBA中的约束

我正在尝试使用Solverfind一个简单投资组合的最大回报。 在工作表中使用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 

任何build议感激地欢迎!

find了解决这个问题的方法。 对于“FormulaText:= 1”标志。 而不是使用1,而是使用对值为1的任何单元格的引用。

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

我有完全相同的问题。 我用下面的方法解决了这个问题:只要键入FormulaText:= 1而不用引号1。

我认为,只要值正好是1,就有一个bug。其他的post指出,上面的解决scheme(把值放到一个单元格中)是不可靠的。 我发现它不起作用我的代码总是指一个单元格,其中包含约束的限制。 我的(原油)解决scheme是将极限值在10 ^ 12或更低的范围内按正确的方向移动1个部分,使得约束变为<或>而不是<=或> =。 所以而不是:

SolverAdd CellRef:= Range(“SolverParam”)。Address,Relation:= 3,_ FormulaText:= Range(“SolverConstraint”)。

使用:

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

对于Relation:= 1使用相反的符号

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

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

进一步寻找我从网上find了另一个解决scheme

FormulaText:=“=”&Range(“SolverConstraint”)

似乎可靠地工作