我正在使用VBA循环数百行,Objective
个单元格使用Solver进行最小化。
解算器通常无法找到解决方案,但没有提供任何信息来指示Objective
单元格是否合法地被最小化,或者解算器是否过早退出,因为它无法找到可行的解决方案。
我正在使用SolverSolve UserFinish:=True
和SolverFinish KeepFinal:=1
来避免点击数百个对话框。
理想情况下,我希望能够在Objective
单元格旁边返回某种标记,以指示解算器是否能够找到解决方案。
以下是我的代码示例:
For i = iStart To iStop
'clear solver
SolverReset
'set up formula
SolverOk SetCell:=Range("$EN$4").Offset(i, 0).Address, MaxMinVal:=2, ValueOf:=0, ByChange:= _
Range("$U$4:$AE$4,$BX$4:$CI$4,$CJ$4:$CU$4").Offset(i, 0).Address, _
Engine:=2, EngineDesc:="GRG Nonlinear"
'set parameters
'set variables as integers
'number of each model
SolverAdd CellRef:=Range("$U$4:$AE$4").Offset(i, 0).Address, _
Relation:=4, FormulaText:="integer"
'mono allocations
SolverAdd CellRef:=Range("$BX$4:$CI$4").Offset(i, 0).Address, _
Relation:=4, FormulaText:="integer"
'colour allocations
SolverAdd CellRef:=Range("$CJ$4:$CU$4").Offset(i, 0).Address, _
Relation:=4, FormulaText:="integer"
'set mono/colour max >= Optimal mono/colour click allocation
SolverAdd CellRef:=Range("$EI$4").Offset(i, 0).Address, _
Relation:=3, FormulaText:=Range("$EK$4").Offset(i, 0).Address
'set colour max >= Optimal total colour click allocation
SolverAdd CellRef:=Range("$EJ$4").Offset(i, 0).Address, _
Relation:=3, FormulaText:=Range("$EM$4").Offset(i, 0).Address
'solve and avoid popups
SolverSolve UserFinish:=True
SolverFinish KeepFinal:=1
Next i
答案 0 :(得分:1)
函数SolverSolve
返回可用于确定结果的结果
来自MSDN:
如果尚未完全定义解算器问题,SolverSolve将返回#N / A错误值。否则,Solver将运行,SolverSolve将返回与“求解器结果”对话框中显示的消息对应的整数值:
0 =解算器找到了解决方案。满足所有约束条件和最优条件 1 =解算器已收敛到当前解决方案。满足所有约束条件 2 =解算器无法改善当前的解决方案。满足所有约束条件 3 =达到最大迭代限制时停止选择 4 =目标单元格值不收敛 5 =解算器无法找到可行的解决方案 6 =解算器因用户的要求而停止 7 =不满足此LP解算器所需的线性度条件 8 =问题太大,Solver无法处理。
9 =解算器在目标或约束单元格中遇到错误值 10 =达到最大时限时停止选择 11 =没有足够的内存可用于解决问题 13 =模型错误。请验证所有单元格和约束是否有效 14 =求解器在容差范围内找到整数解。满足所有约束条件 15 =达到可行[整数]解的最大数量时停止选择 16 =达到可行[整数]子问题的最大数量时停止选择 17 =解算器在概率上收敛于全局解 18 =所有变量必须同时具有上限和下限 19 =二元或不同约束中的变量边界冲突 20 =变量的下限和上限不允许有可行的解决方案。
您可以使用它来确定Solve的成功与否,然后根据需要在工作表上写一个标记