如何编写循环Solver宏实现逐行最低成本优化?
VBA循环实现Excel Solver遍历多行求解最低成本方案
刚接触VBA的话,要把单一行的Solver逻辑改成循环其实超简单,核心就是把固定的行号(比如你原来写的9)换成一个循环变量,让它从10跑到50就行。我来一步步给你拆解思路和修改后的代码:
核心思路拆解
- 用循环变量替代固定行号:定义一个整数变量(比如
i),让它从10遍历到50,每次循环里的单元格地址都用i来拼接,比如$J$9变成"$J$" & i。 - 每次循环重置Solver:一定要记得用
SolverReset清空上一次的约束和设置,不然旧的约束会和新行的约束混在一起,导致计算出错。 - 精简重复代码:你原来的代码里重复了好几次
SolverOk,这完全没必要,循环里只需要调用一次就够了。
修改后的完整代码
Sub SolveMultipleRows() Dim i As Integer ' 遍历第10行到第50行 For i = 10 To 50 ' 重置Solver,清除上一轮的约束与设置 SolverReset ' 设置当前行的Solver目标:J列单元格最小化 SolverOk SetCell:="$J$" & i, MaxMinVal:=2, ValueOf:=0, _ ByChange:="$C$" & i & ":$F$" & i, _ Engine:=1, EngineDesc:="GRG Nonlinear" ' 添加当前行的约束:C列单元格<=23 SolverAdd CellRef:="$C$" & i, Relation:=1, FormulaText:="23" ' 添加当前行的约束:D列单元格<=23 SolverAdd CellRef:="$D$" & i, Relation:=1, FormulaText:="23" ' 执行求解,UserFinish:=True跳过完成弹窗,自动继续循环 SolverSolve UserFinish:=True ' 可选:保存当前行的Solver设置到K列,方便后续查看 SolverSave SaveArea:="$K$" & i Next i End Sub
注意事项
- 启用Solver引用:如果运行时报找不到Solver的错误,先在VBA编辑器里点击「工具」→「引用」,勾选「Solver」(如果找不到,可能需要先在Excel里启用Solver加载项)。
- 扩展约束:如果还有E、F列或者其他约束,直接在循环里添加对应的
SolverAdd语句,把行号换成i就行,比如SolverAdd CellRef:="$E$" & i, Relation:=...。 - UserFinish参数:加了这个参数后,求解完成不会弹出确认窗口,批量处理时效率更高;如果需要看每一行的求解结果,可以把这个参数去掉。
内容的提问来源于stack exchange,提问作者A Moor
相关产品推荐
相关产品推荐

