在Excel中,在循环中运行求解器以优化具有约束的目标单元格

时间:2017-01-13 05:51:21

标签: excel vba optimization solver

我对VBA,MACRO完全不熟悉。我需要一个循环来优化

  • 首先,必须使用约束单元格(R10)
  • 运行目标函数单元格(N10)
  • 然后它应该转移到目标和约束的下一列。对于Cell O10&细胞S10,类似于2次。
  • 然后它应该转移到第i + 9行并重复相同的步骤分析。

有两个循环是精确的,一个用于列循环4次和行循环,直到它到达结束。

Excel snapshot of Data

1 个答案:

答案 0 :(得分:0)

有几个问题......

  • 您应始终在代码中使用Option Explicit。这有助于捕获因类型不匹配而导致的错误。
  • 使用Cells(x,y)时,您应始终使用工作表对其进行限定。
  • 尽管使用Ranges作为Solver例程的输入似乎有时会起作用,但最好始终使用字符串。
  • SolverReset将导致Excel切换到手动计算模式。当在这样的循环中使用时,你应该先调用它,而不是最后一次。
  • 在SolverOK中,同时指定Engine和EngineDesc会导致不匹配,从而导致失败。我建议总是省略EngineDesc。
  • 目前还不清楚SolverOK中的“ByChange”字段应该是什么。我假设它与你的约束相同,但你需要解决这个问题。
  • 如果没有您的样本数据,则尚未对此进行测试。

以下代码应通过标记的适当修改来实现您的目标。

Option Explicit
Sub mySolve()
Dim totalrows As Long
totalrows = 1000 ' *** use whatever formula finds your last row

Dim row As Long
Dim col As Long
Dim myWS As Worksheet
Dim SetAddr As String, ChgAddr As String, ConAddr As String

Set myWS = ActiveSheet
For row = 10 To totalrows Step 9
    For col = 14 To 17 Step 1
        SetAddr = myWS.Cells(row, col).Address
        ChgAddr = myWS.Cells(row, col + 4).Address '*** you don't specify in your question
        ConAddr = myWS.Cells(row, col + 4).Address
        SolverReset
        SolverOk SetCell:=SetAddr, MaxMinVal:=2, ByChange:=ChgAddr, Engine:=3
        SolverAdd CellRef:=ConAddr, Relation:=1, FormulaText:="2" '*** what is your constraint
        SolverSolve Userfinish:=True
    Next col
Next row

End Sub