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

如何在Solver VBA中使用动态范围实现多行循环求解?

修正Solver VBA动态范围循环求解的代码

原代码的问题

你尝试的代码存在两处关键错误:

  1. ByChange 参数不需要 .Value,Solver 要求传入Range对象而非单元格值;
  2. Range(cells(i, 14):cells(i, 18)) 的写法可以简化,统一使用大写 Cells 更符合VBA编码规范(虽不影响运行,但可读性更强)。

修正后的动态循环代码

以下是适配多行循环的完整代码示例(假设循环处理第3行到第10行,可根据实际需求修改循环范围):

Dim i As Integer
' 设置循环的行范围,这里从第3行到第10行,可自行调整
For i = 3 To 10
    ' 重置Solver,清除上一次的约束和设置
    SolverReset
    
    ' 动态指定当前行的目标单元格和可变单元格范围
    SolverOk SetCell:=Cells(i, 6), MaxMinVal:=2, ValueOf:=0, _
            ByChange:=Cells(i, 14).Resize(1, 5), _
            Engine:=1, EngineDesc:="GRG Nonlinear"
    
    ' 为当前行的可变单元格添加整数约束(N到R列)
    SolverAdd CellRef:=Cells(i, 14).Resize(1, 5), Relation:=4, FormulaText:="integer"
    
    ' 为当前行的目标单元格添加非负约束(F列)
    SolverAdd CellRef:=Cells(i, 6), Relation:=3, FormulaText:="0"
    
    ' 执行求解,True表示不显示求解结果对话框
    SolverSolve UserFinish:=True
Next i

关键改动说明

  • 用循环变量 i 动态定位每行的目标单元格(Cells(i,6) 对应F列第i行)和可变单元格范围(Cells(i,14).Resize(1,5) 对应N到R列共5个单元格);
  • 每次循环前调用 SolverReset,避免上一次求解的约束和设置干扰当前行;
  • 移除了原固定代码中冗余的重复 SolverOk 调用,动态循环中只需调用一次即可;
  • 用 Resize(1,5) 替代 Range(Cells(i,14):Cells(i,18)),写法更简洁且不易出错。

内容的提问来源于stack exchange,提问作者H.K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:40:23