SolverSolve 函数
开始执行规划求解的求解过程。 相当于单击“规划求解参数”对话框中的“求解”。
注意 默认情况下未启用规划求解加载项。 在可以使用此函数之前,必须已安装且已启用规划求解加载项。 有关如何执行该操作的信息,请参阅使用规划求解 VBA 函数。 安装规划求解加载项之后,必须创建对该规划求解加载项的引用。 在 Visual Basic 编辑器中,如果模块处于活动状态,请单击“工具”菜单上的“引用”,然后在“可用的引用”下选择“规划求解”。 如果“规划求解”没有显示在“可使用的引用”下面,请单击“浏览”,然后打开 \Program Files\Microsoft Office\Office14\Library\SOLVER 子文件夹中的 Solver.xlam。
SolverSolve ( UserFinish、 ShowRef)
UserFinish 可选 Variant。 如果为 True,则返回结果,而不显示“规划求解结果”对话框。 如果为 False 或忽略,则返回结果,并显示“规划求解结果”对话框。 ShowRef 可选 Variant。 可以将宏的名称 (作为字符串) 作为 ShowRef 参数传递。 然后,每当规划求解因下面列出的任何原因暂停时,将调用此宏,而不是显示“ 显示试用解决方案 ”对话框。 ShowRef 宏的签名 函数 名称 (Reason As Integer) 。 参数 Reason 是 从 1 到 5 的整数值:
由于选中“规划求解选项”对话框中的“显示迭代结果”框而在每次迭代时调用的函数,或者由于用户按 Esc 来中断规划求解而调用的函数。
由于超过“规划求解选项”对话框中的“最长运算时间”限制而调用的函数。
由于超过“规划求解选项”对话框中的“迭代次数”限制而调用的函数。
由于超过“规划求解选项”对话框中的“最大子问题数”限制而调用的函数。
由于超过“规划求解选项”对话框中的“最大可行解数”限制而调用的函数。
如果规划求解应停止 (与“显示试用解决方案”对话框中的“停止”按钮相同) ,则宏函数必须返回 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 支持和反馈,获取有关如何接收支持和提供反馈的指南。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈