You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何自动化批量调用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

火山引擎 最新活动