2017-01-13 26 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