2017-01-13 27 views
-1

对于VBA,MACRO我是全新的。我需要一个循环以优化在Excel中运行求解器以循环优化具有约束条件的目标单元格

  • 首先,它具有运行与约束细胞(R10)
  • 然后,它应该转移到下一列两个目标和约束的目标函数细胞(N10)。即Cell O10 & Cell S10,类似地再进行2次。
  • 然后它应该转移到第i + 9行并重复相同的步骤分析。

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

Excel snapshot of Data

+0

您的代码的屏幕截图是提供您已完成的示例的不佳方式。 – OldUgly

+0

特赦!我是个开胃菜。将学习如何以可重现的方式表示它。并感谢您的意见。 –

回答

0

有几个问题...

  • 应始终使用选择在你的代码明确。这将有助于捕获由于类型不匹配而导致的错误。
  • 使用Cells(x,y)时,应始终使用工作表进行限定。
  • 虽然使用范围作为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