2013-03-25 89 views
2

我正在嘗試使用求解器找到一個簡單投資組合的最大回報。在工作表中使用求解器直接工作,但在VBA中設置命令時不會。相反(正如你可以從screengrab中看到的那樣)忽略了其中一個約束條件(在T10中計算的權重總和應該等於1)。Excel求解器忽略VBA中的約束

SolverAdd CellRef:="$T$10", Relation:=2, FormulaText:="100" 

或大於「1」以外的任何其他整數:有趣的是,如果我改變第三行說工作正常。 (它也可能忽略其他約束,但我無法檢查這一點)。 表看起來是這樣的: enter image description here

而且我的代碼是:

Sub FindRange() 

       SolverReset 
       SolverOk SetCell:="$T$7", MaxMinVal:=1, ValueOf:="0", ByChange:="$O$10:$R$10" 
       SolverAdd CellRef:="$T$10", Relation:=2, FormulaText:="1" 
       SolverAdd CellRef:="$O$10:$R$10", Relation:=3, FormulaText:="0" 
       SolverSolve UserFinish:=True 
       SolverFinish KeepFinal:=1 
       Range("T9").Value = Range("T7").Value 
      End Sub 

任何建議感激地歡迎!

+0

該代碼看起來不錯。它似乎以非VBA vs VBA的方式迭代?也許嘗試在'SolverOK'之前添加'CellRef'? – 2013-03-25 20:41:04

+0

也許嘗試只使用'FormulaText:= 1'?(沒有雙引號)我提到它是因爲[MSDN上的代碼](http://msdn.microsoft.com/en-us/library/office/ff838657.aspx)不使用引號。 – 2013-03-25 22:11:03

+0

謝謝。卸下雙引號確實幫助(即它保持低於10),但它現在忽略「$Ø$ 10:$ R $ 10」應該等於0,所以兩個約束被忽略 – Mary 2013-03-26 12:11:55

回答

2

找到了解決該問題的方法。對於「FormulaText:= 1」標誌。而不是使用1,而是使用對值爲1的任何單元格的引用。

即,改變 「FormulaText:= 1」 到 「FormulaText:= $ H $ 5」,其中$ H $ 5'S值爲1

+0

不幸的是,這有時仍然失敗。 – Mary 2013-05-09 14:21:37

0

我有相同的問題。我用下面的方法解決了這個問題: 只需輸入FormulaText:= 1而不用引號1即可。

1

我認爲每當數值恰好爲1時,就會出現一個錯誤。其他貼子聲明上述解決方案進入一個單元格)是不可靠的。 我發現它不起作用我的代碼總是指一個擁有約束限制的單元格。我的(原油)解決方案是將極限值在10^12或更低的範圍內按適當的方向移動1個部分,這種方式使得約束變爲<或>而不是< =或> =。 因此,而不是:

SolverAdd CellRef:=範圍( 「SolverParam」)地址,關聯:= 3,_ FormulaText:=範圍( 「SolverConstraint」)值

用途:

SolverAdd CellRef:= Range(「SolverParam」)。Address,Relation:= 3,_ FormulaText:= Range(「SolverConstraint」)value + Abs(Range(「SolverConstraint」)value)* 1e -12

並使用相反的符號表示關係:= 1

在這個簡單的例子中,SolverParam是要調整的單個單元參數,SolverConstraint是單個單元格的下限。

這是唯一一致的方法我可以預見到有所有值的統一處理

關於進一步看,我發現從網上另一個解決方案

FormulaText:=「=」 &範圍(「SolverConstraint 「).value

似乎可靠工作

+0

將'Relation:= 2,FormulaText:1'更改爲'Relation:= 2,FormulaText:=「= 1」'解決了我的問題。 – sevenkul 2017-12-28 12:01:49