3

我正在尝试使用 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

任何建议都非常欢迎!

4

3 回答 3

3

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

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

于 2013-05-07T17:54:58.910 回答
1

我认为只要值正好是 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

似乎工作可靠

于 2016-12-11T21:38:55.903 回答
0

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

于 2014-03-14T13:13:01.863 回答