簡體   English   中英

在 Excel 中循環運行求解器以優化具有約束的目標單元格

[英]In Excel to run solver in a loop to optimize a objective cell with constraints

我對 VBA、MACRO 完全陌生。 我需要一個循環來優化一個

  • 首先它必須運行帶有約束單元格 (R10) 的目標函數單元格 (N10)
  • 然后它應該移動到下一列的目標和約束。即對於單元格 O10 和單元格 S10,同樣多 2 次。
  • 然后它應該移到第 i+9 行並重復相同的步驟分析。

准確地說有兩個循環,一個用於列循環 4 次和行循環,直到它結束。

數據的 Excel 快照

有幾個問題...

  • 您應該始終在代碼中使用 Option Explicit。 這將有助於捕獲由於類型不匹配而導致的錯誤。
  • 使用Cells(x,y) ,應始終使用工作表對其進行限定。
  • 盡管使用范圍作為求解器例程的輸入有時似乎有效,但始終使用字符串是更好的做法。
  • 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM