如何在Solver VBA中使用动态范围实现多行循环求解?
修正Solver VBA动态范围循环求解的代码
原代码的问题
你尝试的代码存在两处关键错误:
ByChange参数不需要.Value,Solver 要求传入Range对象而非单元格值;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.
相关产品推荐
相关产品推荐

