簡體   English   中英

Excel規划求解忽略VBA中的約束

[英]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.

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