如何自动化批量调用Solver执行多组线性规划求解?
用VBA自动化批量执行Excel Solver线性规划
当然可以!完全不用手动重复调用Solver 10次,用Excel VBA写一段宏就能自动遍历第7到16行,批量完成所有线性规划求解。我经常帮人处理这种重复的Solver任务,VBA绝对是最高效的解决方案。
第一步:确保Solver加载项已启用
先确认你的Excel已经启用了Solver加载项,否则VBA代码会报错:
- 点击「文件」→「选项」→「加载项」
- 在下方「管理」下拉选「Excel加载项」,点击「转到」
- 勾选「规划求解加载项」,确定即可。
第二步:VBA代码实现
打开VBA编辑器(按Alt+F11),插入一个新模块,粘贴以下代码:
Sub BatchSolver() Dim rowNum As Integer ' 遍历第7到16行的10组数据 For rowNum = 7 To 16 ' 设置Solver核心参数:最大化当前行A列的目标值 SolverOk SetCell:=Range("A" & rowNum), _ MaxMinVal:=1, _ ' 1代表最大化目标值 ValueOf:=0, _ ByChange:=Range("B" & rowNum & ":D" & rowNum) ' 可变单元格为当前行B/C/D列 ' 添加约束:B/C/D列当前行 >= B2的阈值 SolverAdd CellRef:=Range("B" & rowNum), _ Relation:=3, _ ' 3对应>=关系 FormulaText:="$B$2" SolverAdd CellRef:=Range("C" & rowNum), _ Relation:=3, _ FormulaText:="$B$2" SolverAdd CellRef:=Range("D" & rowNum), _ Relation:=3, _ FormulaText:="$B$2" ' 添加约束:B/C/D列当前行 <= B3的阈值 SolverAdd CellRef:=Range("B" & rowNum), _ Relation:=1, _ ' 1对应<=关系 FormulaText:="$B$3" SolverAdd CellRef:=Range("C" & rowNum), _ Relation:=1, _ FormulaText:="$B$3" SolverAdd CellRef:=Range("D" & rowNum), _ Relation:=1, _ FormulaText:="$B$3" ' 添加约束:B+C+D当前行总和等于100%(即Excel中的数值1) SolverAdd CellRef:=Range("B" & rowNum & ":D" & rowNum), _ Relation:=2, _ ' 2对应=关系 FormulaText:="1" ' 执行求解,UserFinish=True表示后台完成不弹对话框 SolverSolve UserFinish:=True ' 重置Solver状态,避免上一行约束干扰下一行 SolverReset Next rowNum MsgBox "所有10组数据的线性规划求解已完成!" End Sub
代码关键细节说明
- 循环遍历:
For rowNum = 7 To 16自动覆盖你需要处理的10行数据,要是后续行数有变化,直接改数字就行。 - 约束对应关系:
Relation参数的数字是Solver的固定规则:1代表<=,2代表=,3代表>=,别搞混就行。 - 批量静默处理:
UserFinish:=True让求解在后台完成,不会每次都弹出确认框,处理效率高很多。 - 重置状态:
SolverReset必须加,不然上一行的约束会残留到下一行,导致求解出错。
运行宏
回到Excel界面,按Alt+F8,选择BatchSolver,点击执行就可以等着自动完成所有求解了。
内容的提问来源于stack exchange,提问作者JungleDiff




