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 中的每个值,您都是 运行 求解器。求解器中的所有引用现在都基于您正在循环的单元格。希望这有助于您的目的。此致,