【问题标题】:EXCEL VBA Run Solver Over Multiple rows Using a LoopEXCEL VBA 使用循环在多行上运行求解器
【发布时间】:2015-07-13 21:24:01
【问题描述】:

大家好:我对 VBA 完全陌生,所以我使用宏记录器来帮助获取我想要的代码的要点。 我对 Solver 的所有输入都在一行中(例如我的工作表的第 19 行)。我的目标单元格在 R 列中,决策单元格在 E 列和 F 列中,约束在 G 列中。我最终想创建更多输入行,比如 10 个,10 个目标函数都在 R 列中等等...... 我想保持列固定,但创建一个循环遍历 10 行,为每一行运行求解器,然后重置并运行下一行。当它到达第 10 行时,它会检查 $R29 是否为 "",如果是,它会停止运行。

我知道我可能应该使用某种形式的“Do While Cells(Row,1) "" " 构造,但我不知道如何在 VBA 中创建这个简单的循环。 谢谢

    Sub RR_SC_OPTIMIZER()
'
' RR_SC_OPTIMIZER Macro
'

'
    SolverOk SetCell:="$R$19", MaxMinVal:=2, ValueOf:=0, ByChange:="$E$19:$F$19", _
        Engine:=1, EngineDesc:="GRG Nonlinear"
    SolverAdd CellRef:="$E$19", Relation:=1, FormulaText:="$G$19"
    SolverOk SetCell:="$R$19", MaxMinVal:=2, ValueOf:=0, ByChange:="$E$19:$F$19", _
        Engine:=1, EngineDesc:="GRG Nonlinear"
    SolverOk SetCell:="$R$19", MaxMinVal:=2, ValueOf:=0, ByChange:="$E$19:$F$19", _
        Engine:=1, EngineDesc:="GRG Nonlinear"
    SolverSolve
    SolverOk SetCell:="$R$19", MaxMinVal:=2, ValueOf:=0, ByChange:="$E$19:$F$19", _
        Engine:=1, EngineDesc:="GRG Nonlinear"
End Sub

【问题讨论】:

    标签: excel loops solver vba


    【解决方案1】:

    您可以尝试以下脚本(未经测试):

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

    【讨论】:

    • 非常感谢 nbayly!我将测试代码,如果它回答了问题或引导了一个很好的方向,我会让溢出知道。我真的很感激。
    猜你喜欢
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2013-03-08
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    相关资源
    最近更新 更多