[英]Excel Solver Ignoring Constraint in VBA
我正在嘗試使用規划求解找到簡單投資組合的最大回報。 在工作表中直接使用規划求解是明智的,但是在VBA中設置命令時則無效。 而是(如您從屏幕抓圖中看到的)它忽略了一個約束(在T10中計算的權重之和應為= 1)。 有趣的是,如果我將第三行改為:
SolverAdd CellRef:="$T$10", Relation:=2, FormulaText:="100"
或“ 1”以外的任何其他整數。 (它也可能會忽略其他約束,但我無法檢查)。 該表如下所示:
我的代碼是:
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
任何建議表示感謝!
找到了解決該錯誤的方法。 對於標志“ FormulaText:= 1”。 而不是使用1,而是使用對值為1的任何單元格的引用。
即,將“ FormulaText:= 1”更改為“ FormulaText:= $ H $ 5”,其中$ H $ 5的值為1
我認為每當值正好為1時,這里就有一個bug。其他帖子指出上述解決方案(將值放入單元格)是不可靠的。 我發現它不起作用,我的代碼始終引用持有約束限制的單元格。 我的(粗略)解決方案是在適當的方向上將極限值在10 ^ 12或更低的范圍內移動1個部分,這使約束成為<或>而不是<=或> =。 因此,而不是:
SolverAdd CellRef:= Range(“ SolverParam”)。Address,Relation:= 3,_ FormulaText:= Range(“ SolverConstraint”)。value
采用:
SolverAdd CellRef:= Range(“ SolverParam”)。Address,Relation:= 3,_ FormulaText:= Range(“ SolverConstraint”)。value + Abs(Range(“ SolverConstraint”)。value)* 1e-12
並對關系使用相反的符號:= 1
在這個簡單的示例中,SolverParam是要調整的單個單元格參數,而SolverConstraint是單個單元格的下限。
我可以預見這是唯一一致的方法,可以統一處理所有值
進一步查看后,我發現了網絡上的另一種解決方案
FormulaText:=“ =”&Range(“ SolverConstraint”)。value
似乎工作可靠
我有完全相同的問題。 我通過以下方式解決了問題:只需鍵入FormulaText:= 1,而不用引號將1括起來。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.