2016-08-30 43 views
0

我對VBA不是很有經驗,但是我對它有基本的瞭解。我試圖創建一個優化模型,其中求解器生成一組約束的最小值:使用求解器寫入值

-Cell O40需要最小化,並且該值記錄並打印在單元格中Kx -Cell O41是我的動態約束,需要將其設置爲等於解算器每次迭代的單元格Jx中的值。 -Cells J40:J45是將會改變的權重,並受制於約束J46 = 1(其中J46 = SUM(J40:J45)使得權重加起來爲1)

我運行Solver一次並記錄宏,得到了以下的輸出:

子解()

SolverAdd CellRef:="$J$46", Relation:=2, FormulaText:="1" 
SolverAdd CellRef:="$O$41", Relation:=2, FormulaText:="$J17" 
SolverOk SetCell:="$O$40", MaxMinVal:=2, ValueOf:=0, ByChange:="$J$40:$J$45", _ 
    Engine:=1, EngineDesc:="GRG Nonlinear" 
SolverSolve 

末次

現在我需要求解器做兩件事情:

  1. 在程序結束時將單元格O40中求解的值寫入單元格Kx中,其中單元格Kx對應於確定單元格O41的固定值約束的相鄰單元格Jx。

  2. 對範圍J17:J33重複該過程,更改單元格O41中的固定值約束。

結果應該是單元格K17:K33中的值填充到單元格J17:J33中的給定級別並最小化。

我感謝任何幫助,我可以得到。

+0

您有兩個問題:解決優化問題和編程。你的問題對於SO來說太廣泛了。 – duffymo

+0

我確定需要幾行代碼來指定我需要更改的單元格範圍,並且在每次迭代之後都需要某種計數器來抵消單元格,但這是我需要幫助的。我可以手動完成,但對於需要做什麼來說效率很低。 – fede

+0

有趣的問題,我想你需要寫一個VBA宏根據你的規格上面。當你詳細描述過程時,現在並不難。 –

回答

0

我認爲做遞歸最好的辦法是做一個While循環,這樣的事情:

Dim a as Variant 
a = 17 

While a <= 33 
    'Solver functionality in here 
    a = a + 1 
Wend 

這將覆蓋你的問題的第一部分。下一個問題是保持你的求解器參考不變。在這種情況下,我會將J17:J33中的值放在一個單獨的位置,並在需要時將這些值移動到相關的單元格中。這意味着在每個解決方案之後,您都會將建議的答案複製到另一個位置,併爲下一次解決方案嘗試帶來新信息。