跨多个列和行的解算器VBA宏

跨多个列和行的解算器VBA宏,vba,excel,solver,Vba,Excel,Solver,VBA新手。在互联网上搜索,无法找到解决方案(但我在这个过程中学到了很多) 我运行solver来求解一个收入数字,该数字将在给定某些费用的情况下为我提供指定的利润率。我已经准备好了,还有一个潜艇,可以在一个月内正常完成这项任务。然而,我试图将此应用于12列(12个月)。然后将循环向下移动19行。在这12列上运行求解器6次,以此类推 代码如下: Sub Monthly() SolverReset SolverAdd CellRef:="$d$40", Relation:=2, FormulaT

VBA新手。在互联网上搜索,无法找到解决方案(但我在这个过程中学到了很多)

我运行solver来求解一个收入数字,该数字将在给定某些费用的情况下为我提供指定的利润率。我已经准备好了,还有一个潜艇,可以在一个月内正常完成这项任务。然而,我试图将此应用于12列(12个月)。然后将循环向下移动19行。在这12列上运行求解器6次,以此类推

代码如下:

Sub Monthly()


SolverReset
SolverAdd CellRef:="$d$40", Relation:=2, FormulaText:="$d$41"
SolverOk SetCell:="$d$40", MaxMinVal:=1, ValueOf:=0, ByChange:="$d$24", Engine _
    :=1, EngineDesc:="GRG Nonlinear"
SolverSolve True

SolverReset
SolverAdd CellRef:="$e$40", Relation:=2, FormulaText:="$e$41"
SolverOk SetCell:="$e$40", MaxMinVal:=1, ValueOf:=0, ByChange:="$e$24", Engine _
    :=1, EngineDesc:="GRG Nonlinear"
SolverSolve True
这是一个可以让我在1月和2月得到的例子。希望它在剩余的10个月内运行(无需复制和粘贴10次,并手动键入F-O列的单元格坐标)。那么下面的代码是针对19行的步骤:

SolverReset
SolverAdd CellRef:="$d$59", Relation:=2, FormulaText:="$d$60"
SolverOk SetCell:="$d$59", MaxMinVal:=1, ValueOf:=0, ByChange:="$d$43", Engine _
    :=1, EngineDesc:="GRG Nonlinear"
SolverSolve True


End Sub
再一次,我想让它在12列中运行,并向下移动19行,再重复4次。因此,最终结果是求解器在12列上运行6次,总共72次。我不想多次输入这些单元格坐标,这样做可能会对我的CPU造成负担。谢谢

更新:

我现在犯了一个错误,似乎是无缘无故的。这东西很好用

Sub MonthlySolve1a()
    Dim c As Range
    Set c = ActiveSheet.Range("D40")
    MonthlySolve1b c
End Sub

'solve 12 months
Sub MonthlySolve1b(c As Range)
Dim m  As Long
For m = 1 To 12

    SolverReset
    SolverAdd CellRef:=c.Address(), Relation:=2, FormulaText:=c.Offset(1, 0).Address()
    SolverOk SetCell:=c.Address(), MaxMinVal:=1, ValueOf:=0, _
            ByChange:=c.Offset(-16, 0).Address(), Engine:=1, EngineDesc:="GRG Nonlinear"
    SolverSolve True

    Set c = c.Offset(0, 1)
Next m
End Sub

我可能在我的工作表上做了一些愚蠢的事情,把事情搞砸了,但任何洞察都将不胜感激。谢谢

您可以使用循环在每个月运行解算器:

Sub Tester()
    Dim c As Range
    Set c = ActiveSheet.Range("D40")
    Monthly c
End Sub


'solve 12 months
Sub Monthly(c As Range)
    Dim m  As Long
    For m = 1 To 12

        SolverReset
        SolverAdd CellRef:=c.Address(), Relation:=2, FormulaText:=c.Offset(1, 0).Address()
        SolverOk SetCell:=c.Address(), MaxMinVal:=1, ValueOf:=0, _
                ByChange:=c.Offset(-16, 0).Address(), Engine:=1, EngineDesc:="GRG Nonlinear"
        SolverSolve True

        Set c = c.Offset(0, 1)
    Next m
End Sub

非常好-工作非常好。我可以使用这个脚本6次,只需将D40地址更改为D59、D78等(每次逐步减少19个)。谢谢!不知怎的,“工具”>“引用”>“解算器”复选框未选中。问题解决