Excel VBA求解器循环 - 如何标记求解器无法找到可行解的行

时间:2018-01-06 03:06:10

标签: excel vba excel-vba for-loop solver

我正在使用VBA循环数百行,Objective个单元格使用Solver进行最小化。

解算器通常无法找到解决方案,但没有提供任何信息来指示Objective单元格是否合法地被最小化,或者解算器是否过早退出,因为它无法找到可行的解决方案。

我正在使用SolverSolve UserFinish:=TrueSolverFinish 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

1 个答案:

答案 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的成功与否,然后根据需要在工作表上写一个标记

参考MSDN article