在创建使用求解器的程序时,我需要用户能够手动输入收敛值和内置求解器使用的精度。我希望能够将收敛值设置为可以通过用户输入设置的单元格或变量。
以下是我正在使用的解算器代码示例:
SolverReset
SolverOk SetCell:="$D$14", MaxMinVal:=2, ValueOf:=0, ByChange:="$F$2:$F$5", _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverAdd CellRef:="$F$2", Relation:=1, FormulaText:="100"
SolverAdd CellRef:="$F$2", Relation:=3, FormulaText:="0.0000000001"
SolverAdd CellRef:="$F$3", Relation:=1, FormulaText:="100"
SolverAdd CellRef:="$F$3", Relation:=3, FormulaText:="-100"
SolverAdd CellRef:="$F$4", Relation:=1, FormulaText:="100"
SolverAdd CellRef:="$F$4", Relation:=3, FormulaText:="-100"
SolverAdd CellRef:="$F$5", Relation:=1, FormulaText:="10"
SolverAdd CellRef:="$F$5", Relation:=3, FormulaText:="0.0000000001"
SolverOptions MaxTime:=0, Iterations:=0, Precision:=1E-18, Convergence:= _
1E-16, StepThru:=False, Scaling:=True, AssumeNonNeg:=True, Derivatives:= _
1
SolverSolve True
此代码只是改变单元格F2,F3,F4和F5中的值(在我提供的范围内),以尽量减少D14中的值。
理想情况下,我希望能够将Convergence CellRef:="$B$16"
这样的内容放入其中,但这似乎不起作用。有人知道怎么做这个吗?看起来它应该很简单,但我想出一个空白。
答案 0 :(得分:1)
Convergence
以及所有其他SolverOptions
都可以使用单元格值设置,例如Convergence:= Range("A1").value
。
Value2
is a little faster than Value
,优良做法是显式转换为单元格值的两倍(并且还会捕获任何错误)。
另一种方法是将值添加为命名范围或名称。 This question详细阐述了这些方法。名称的优点是不需要直接在电子表格中显示,这很优雅。例如,用户可以设置它们并从用户表单中进行编辑。
我希望这有帮助!