SolverSolve 函数

开始执行规划求解的求解过程。 相当于单击“规划求解参数”对话框中的“求解”

注意 默认情况下未启用规划求解加载项。 在可以使用此函数之前,必须已安装且已启用规划求解加载项。 有关如何执行该操作的信息,请参阅使用规划求解 VBA 函数。 安装规划求解加载项之后,必须创建对该规划求解加载项的引用。 在 Visual Basic 编辑器中,如果模块处于活动状态,请单击“工具”菜单上的“引用”,然后在“可用的引用”下选择“规划求解”。 如果“规划求解”没有显示在“可使用的引用”下面,请单击“浏览”,然后打开 \Program Files\Microsoft Office\Office14\Library\SOLVER 子文件夹中的 Solver.xlam。

SolverSolve ( UserFinishShowRef)

UserFinish 可选 Variant。 如果为 True,则返回结果,而不显示“规划求解结果”对话框。 如果为 False 或忽略,则返回结果,并显示“规划求解结果”对话框。 ShowRef 可选 Variant。 可以将宏的名称 (作为字符串) 作为 ShowRef 参数传递。 然后,每当规划求解因下面列出的任何原因暂停时,将调用此宏,而不是显示“ 显示试用解决方案 ”对话框。 ShowRef 宏的签名 函数 名称 (Reason As Integer) 。 参数 Reason 是 从 1 到 5 的整数值:

  1. 由于选中“规划求解选项”对话框中的“显示迭代结果”框而在每次迭代时调用的函数,或者由于用户按 Esc 来中断规划求解而调用的函数。

  2. 由于超过“规划求解选项”对话框中的“最长运算时间”限制而调用的函数。

  3. 由于超过“规划求解选项”对话框中的“迭代次数”限制而调用的函数。

  4. 由于超过“规划求解选项”对话框中的“最大子问题数”限制而调用的函数。

  5. 由于超过“规划求解选项”对话框中的“最大可行解数”限制而调用的函数。

如果规划求解应停止 (与“显示试用解决方案”对话框中的“停止”按钮相同) ,则宏函数必须返回 1;如果规划求解应继续运行 (与“继续”按钮) 相同,则宏函数必须返回 0。ShowRef 宏可以检查工作表上的当前解决方案值,或执行其他操作,例如保存或绘制中间值。 但是,它不得更改变量单元格中的值,也不得更改目标和约束单元格中的公式,因为这会对求解过程产生负面影响。

SolverSolve 返回值

如果尚未完整定义规划求解问题,则 SolverSolve 会返回 #N/A 错误值。 否则,规划求解将会运行,并且 SolverSolve 返回与“规划求解结果”对话框中显示的消息相对应的整数值:

返回值 消息
0 规划求解找到解。 满足所有约束和最优条件。
1 规划求解已收敛到当前解。 满足所有约束。
2 规划求解无法改进当前解。 满足所有约束。
3 当超过最大迭代次数限制时选择“停止”。
4 Objective Cell 值不收敛。
5 规划求解找不到可行解。
6 规划求解已根据用户的请求而停止。
7 不满足此 LP 规划求解需要的线性条件。
8 问题太大,规划求解无法处理。
9 规划求解在目标或约束单元格中遇到错误值。
10 当超过最长运算时间限制时选择“停止”。
11 内存不足,无法解决问题。
13 模型出错。 请验证所有单元格和约束是否有效。
14 规划求解在允许误差范围内找到整数解。 满足所有约束。
15 达到最大可行 [整数] 解数时选择“停止”。
16 达到最大可行 [整数] 子问题数时选择“停止”。
17 规划求解在概率上收敛于一个全局解。
18 所有变量都必须拥有上限和下限。
19 二进制或所有不同约束中的变量界限冲突。
20 变量上下限禁止全部可行解。

示例

本示例使用规划求解函数来最大化业务问题的毛利润。 SolverSolve 函数开始规划求解解决方案运行。 存在上述五个条件中的任一条件时,规划求解调用函数 ShowTrial;该函数只显示一条包含整数值 1 到 5 的消息。

Worksheets("Sheet1").Activate 
SolverReset 
SolverOptions Precision:=0.001 
SolverOK SetCell:=Range("TotalProfit"), _ 
    MaxMinVal:=1, _ 
    ByChange:=Range("C4:E6") 
SolverAdd CellRef:=Range("F4:F6"), _ 
    Relation:=1, _ 
    FormulaText:=100 
SolverAdd CellRef:=Range("C4:E6"), _ 
    Relation:=3, _ 
    FormulaText:=0 
SolverAdd CellRef:=Range("C4:E6"), _ 
    Relation:=4 
SolverSolve UserFinish:=False, ShowRef:= "ShowTrial" 
SolverSave SaveArea:=Range("A33") 
 
Function ShowTrial(Reason As Integer) 
  Msgbox Reason 
  ShowTrial = 0 
End Function

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。