跨多个列和行

时间:2016-02-24 18:17:59

标签: excel vba excel-vba solver

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

我正在运行解决方案来解决一个收入数字,这个数字会给定一定的利润,给定一定的费用。我已经完成所有设置和Sub将正常执行此任务一个月。但是,我试图将其应用于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

我可能在我的工作表中做了一些愚蠢的事情搞砸了,但任何见解都会非常感激。谢谢!

1 个答案:

答案 0 :(得分:2)

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

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