通过更改多个单元格在求解器VBA中设置单元格?

时间:2016-11-18 14:03:47

标签: excel-vba solver vba excel

我正在尝试使用Excel VBA中的求解器通过更改其他3个单元来设置单元格。但是,三个单元格不会因我选择的值而改变(我为每个colomn添加了一个求解器,使其更大,更小于特定值),它似乎解算器无法读取我的内容已经给了它。

我需要知道如何让它读取三个常量并根据它们进行更改。

Sub solver()

For i = 5 To 48
    SolverReset
    objstring = "$I$" & i

    SolverOk SetCell:=Range(objstring), MaxMinVal:=2, ValueOf:=0, ByChange:=Range("C5:E7")
    SolverAdd CellRef:="$C$5:$C$48", Relation:=1, FormulaText:=934000
    SolverAdd CellRef:="$C$5:$C$48", Relation:=3, FormulaText:=953000
    SolverAdd CellRef:=Range("$D$" & i), Relation:=1, FormulaText:="$B$13"
    SolverAdd CellRef:=Range("$D$" & i), Relation:=3, FormulaText:="$B$14"
    SolverAdd CellRef:=Range("$E$" & i), Relation:=1, FormulaText:="$B$15"
    SolverAdd CellRef:=Range("$E$" & i), Relation:=3, FormulaText:="$B$16"

    SolverSolve userfinish:=True

Next i

End Sub

[1]: https://i.stack.imgur.com/dS7x3.jpg

1 个答案:

答案 0 :(得分:0)

我认为您的设置还有其他问题,但是如果没有看到屏幕上的行/列,或者知道公式 - 特别是第I列,很难说清楚。

但是,对于您提出的问题:

  • 虽然不是绝对必要,但不使用SetCellCellRef的范围会更简单。使用字符串。
  • SolverOK语句中,您应明确指定Engine
  • SolverOK语句中,MaxMinVal:=2是最小化的规范。因此,ValueOf将被忽略,可以省略。
  • 这是猜测。你说“我试图通过更改其他3个单元来设置单元格”,但是你的代码正在改变9个单元格。在SolverOKByChange:="C5:E7",我怀疑您需要ByChange:="C5:E5",并希望行与计数器i一起增加。
  • 另一个猜测是,您可能希望以约束$C$5$D$5的方式约束$E$5
  • 另一个猜测 - 单元格$B$13包含值5000,这是Pi的最小值。单元格$B$14包含值8000,这是您的最大值。在SolverAdd中,Relation:=1相当于“小于或等于”或“< =”。 Relation:=3相当于“> =”。您想要“< =”您的最大值,并且“> =”您的最小值...您已向后指定约束。

全部,如下图所示......

Sub solver()

For i = 5 To 48
    SolverReset

    SolverOk SetCell:="$I$" & i, MaxMinVal:=2, ByChange:="$C$" & i & ":$E$" & i, Engine:=1
    SolverAdd CellRef:="$C$" & i, Relation:=1, FormulaText:="$B$18"
    SolverAdd CellRef:="$C$" & i, Relation:=3, FormulaText:="$B$17"
    SolverAdd CellRef:="$D$" & i, Relation:=1, FormulaText:="$B$14"
    SolverAdd CellRef:="$D$" & i, Relation:=3, FormulaText:="$B$13"
    SolverAdd CellRef:="$E$" & i, Relation:=1, FormulaText:="$B$16"
    SolverAdd CellRef:="$E$" & i, Relation:=3, FormulaText:="$B$15"

    SolverSolve userfinish:=True

Next i

End Sub

其他潜在问题......

  • 如果从未运行SolverSolve,SolverReset可以使Excel处于手动计算状态。
  • 我猜你的错误计算是第一列,但你说明的结果没有任何意义(例如qttemp-q(t)?)。你最小化的值应该是ABS(错误)或错误^ 2 - 因为你没有提供公式,我不知道你有什么。