EXCEL VBA 运行 使用循环求解多行
EXCEL VBA Run Solver Over Multiple rows Using a Loop
大家好:我是 VBA 的新手,所以我使用宏记录器来帮助获得我想要的代码的要点。
我对 Solver 的所有输入都在一行中(例如我的工作表的第 19 行)。我的 objective 单元格在 R 列中,决策单元格在 E 列和 F 列中,约束在 G 列中。我最终想创建更多的输入行,比如 10,有 10 个 objective 函数在列 R 等...
我想保持列固定,但创建一个循环遍历 10 行,运行 每行的求解器,然后重置并运行下一行。当它到达第 10 行时,它会检查 $R29 是否为“”,如果是,它会停止 运行.
我知道我可能应该使用某种形式的 "Do While Cells(Row,1) <> "" " 构造,但我不知道如何在 VBA 中创建这个简单的循环。
谢谢
Sub RR_SC_OPTIMIZER()
'
' RR_SC_OPTIMIZER Macro
'
'
SolverOk SetCell:="$R", MaxMinVal:=2, ValueOf:=0, ByChange:="$E:$F", _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverAdd CellRef:="$E", Relation:=1, FormulaText:="$G"
SolverOk SetCell:="$R", MaxMinVal:=2, ValueOf:=0, ByChange:="$E:$F", _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverOk SetCell:="$R", MaxMinVal:=2, ValueOf:=0, ByChange:="$E:$F", _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve
SolverOk SetCell:="$R", MaxMinVal:=2, ValueOf:=0, ByChange:="$E:$F", _
Engine:=1, EngineDesc:="GRG Nonlinear"
End Sub
您可以尝试以下脚本(未经测试):
Sub RR_SC_OPTIMIZER()
Dim rngObjectCells As Range
Set rngObjectCells = Range("R19:R28")
Dim rngObjectCell As Range
For Each rngObjectCell In rngObjectCells
SolverReset
SolverOk SetCell:=rngObjectCell.Address, MaxMinVal:=2, ValueOf:=0, ByChange:=rngObjectCell.Offset(0, -13).Range("A1:B1").Address, _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverAdd CellRef:=rngObjectCell.Offset(0, -13).Address, Relation:=1, FormulaText:=rngObjectCell.Offset(0, -11).Address
SolverOk SetCell:=rngObjectCell.Address, MaxMinVal:=2, ValueOf:=0, ByChange:=rngObjectCell.Offset(0, -13).Range("A1:B1").Address, _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverOk SetCell:=rngObjectCell.Address, MaxMinVal:=2, ValueOf:=0, ByChange:=rngObjectCell.Offset(0, -13).Range("A1:B1").Address, _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve
SolverOk SetCell:=rngObjectCell.Address, MaxMinVal:=2, ValueOf:=0, ByChange:=rngObjectCell.Offset(0, -13).Range("A1:B1").Address, _
Engine:=1, EngineDesc:="GRG Nonlinear"
Next
End Sub
基本上,您正在遍历硬编码范围 R19:R28
(不是 R29
,因为这会使它成为 11 行),并且对于列 R 中的每个值,您都是 运行 求解器。求解器中的所有引用现在都基于您正在循环的单元格。希望这有助于您的目的。此致,
大家好:我是 VBA 的新手,所以我使用宏记录器来帮助获得我想要的代码的要点。 我对 Solver 的所有输入都在一行中(例如我的工作表的第 19 行)。我的 objective 单元格在 R 列中,决策单元格在 E 列和 F 列中,约束在 G 列中。我最终想创建更多的输入行,比如 10,有 10 个 objective 函数在列 R 等... 我想保持列固定,但创建一个循环遍历 10 行,运行 每行的求解器,然后重置并运行下一行。当它到达第 10 行时,它会检查 $R29 是否为“”,如果是,它会停止 运行.
我知道我可能应该使用某种形式的 "Do While Cells(Row,1) <> "" " 构造,但我不知道如何在 VBA 中创建这个简单的循环。 谢谢
Sub RR_SC_OPTIMIZER()
'
' RR_SC_OPTIMIZER Macro
'
'
SolverOk SetCell:="$R", MaxMinVal:=2, ValueOf:=0, ByChange:="$E:$F", _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverAdd CellRef:="$E", Relation:=1, FormulaText:="$G"
SolverOk SetCell:="$R", MaxMinVal:=2, ValueOf:=0, ByChange:="$E:$F", _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverOk SetCell:="$R", MaxMinVal:=2, ValueOf:=0, ByChange:="$E:$F", _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve
SolverOk SetCell:="$R", MaxMinVal:=2, ValueOf:=0, ByChange:="$E:$F", _
Engine:=1, EngineDesc:="GRG Nonlinear"
End Sub
您可以尝试以下脚本(未经测试):
Sub RR_SC_OPTIMIZER()
Dim rngObjectCells As Range
Set rngObjectCells = Range("R19:R28")
Dim rngObjectCell As Range
For Each rngObjectCell In rngObjectCells
SolverReset
SolverOk SetCell:=rngObjectCell.Address, MaxMinVal:=2, ValueOf:=0, ByChange:=rngObjectCell.Offset(0, -13).Range("A1:B1").Address, _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverAdd CellRef:=rngObjectCell.Offset(0, -13).Address, Relation:=1, FormulaText:=rngObjectCell.Offset(0, -11).Address
SolverOk SetCell:=rngObjectCell.Address, MaxMinVal:=2, ValueOf:=0, ByChange:=rngObjectCell.Offset(0, -13).Range("A1:B1").Address, _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverOk SetCell:=rngObjectCell.Address, MaxMinVal:=2, ValueOf:=0, ByChange:=rngObjectCell.Offset(0, -13).Range("A1:B1").Address, _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve
SolverOk SetCell:=rngObjectCell.Address, MaxMinVal:=2, ValueOf:=0, ByChange:=rngObjectCell.Offset(0, -13).Range("A1:B1").Address, _
Engine:=1, EngineDesc:="GRG Nonlinear"
Next
End Sub
基本上,您正在遍历硬编码范围 R19:R28
(不是 R29
,因为这会使它成为 11 行),并且对于列 R 中的每个值,您都是 运行 求解器。求解器中的所有引用现在都基于您正在循环的单元格。希望这有助于您的目的。此致,