You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写循环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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:57:34