2015-05-20 33 views
0

我是VBA的初學者用戶,我在Excel Solver中遇到了一些問題。Excel Solver在找到解決方案之前就結束了 - VBA

基本上我必須計算幾種金融工具的公允價值,按來源國分組。

對於每個國家,求解器將最小化函數以找到模型參數。

到目前爲止,我已經能夠使其工作,並且在50個不同的國家/類別中,解算器在49個案例中工作。

這是我的問題,當涉及到這個國家的解決者經過3或4次迭代後步出。使目標功能遠未達到最小化。 但是,當我點擊一個命令按鈕鏈接完全相同的子程序,它找到了一個解決方案。

這裏是我的代碼的一部分,NSCoeff是鏈接到求解器的子。

Sub NelsonSiegel() 
Dim a, b, c, d, e, f, g, p, s, I, t, v, pv, TIR As Variant 
Dim NumBonds, bnd_cnt As Integer 
Dim current_wb As String 
Dim spot(), df, dfcf, NumberCashFlows, Lambda, Lambda2, Beta1, Beta2, Beta3, Beta4, TimeToCashFlow(), NSPV As Variant 
Dim j As Integer 
Dim Time() As Variant 
Dim A1() As Variant 
Dim A2() As Variant 
Dim A3() As Variant 
Dim A4() As Variant 
current_wb = ThisWorkbook.Name 
NumBonds = Sheets("bonds").Cells(1, 7).Value 

Workbooks(current_wb).Sheets("Nelson_Siegel").Range("n4:s4").Value = 1 
NSCoeff 
Workbooks(current_wb).Sheets("bonds").Calculate 'download coupon date for NS procedure 

Lambda = Worksheets("model").Cells(28, 2) 
Beta1 = Worksheets("model").Cells(29, 2) 
Beta2 = Worksheets("model").Cells(30, 2) 
Beta3 = Worksheets("model").Cells(31, 2) 
Beta4 = Worksheets("model").Cells(32, 2) 
Lambda2 = Worksheets("model").Cells(33, 2) 

這裏的NSCoeff子

Sub NSCoeff() 
Dim current_wb As String 
current_wb = ThisWorkbook.Name 


Workbooks(current_wb).Sheets("Nelson_Siegel").Activate 

    SolverOk SetCell:="$N$9", MaxMinVal:=2, ValueOf:=0, ByChange:="$N$4:$S$4", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:="$N$4", Relation:=3, FormulaText:="0.001" 
    SolverAdd CellRef:="$S$4", Relation:=3, FormulaText:="0.001" 
    SolverOk SetCell:="$N$9", MaxMinVal:=2, ValueOf:=0, ByChange:="$N$4:$S$4", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverOk SetCell:="$N$9", MaxMinVal:=2, ValueOf:=0, ByChange:="$N$4:$S$4", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverSolve userFinish:=True 

如何解決這個問題的任何想法?求解器在從另一個子程序啓動時找不到解決方案,但是當它從命令按鈕啓動時它不起作用。

感謝您的幫助

回答

1

的第一步是從SolverSolve趕上返回值。這可以讓你確定它爲什麼會結束。

Sub NSCoeff() 
    Dim current_wb As Workbook 
    Dim ret As Integer 

    Set current_wb = ThisWorkbook 

    current_wb.Sheets("Nelson_Siegel").Activate 

    SolverOk SetCell:="$N$9", MaxMinVal:=2, ValueOf:=0, ByChange:="$N$4:$S$4", _ 
     Engine:=1, EngineDesc:="GRG Nonlinear" 
    SolverAdd CellRef:="$N$4", Relation:=3, FormulaText:="0.001" 
    SolverAdd CellRef:="$S$4", Relation:=3, FormulaText:="0.001" 
    ret = SolverSolve userFinish:=True 
    MsgBox "SolverSolve returned a value of " & ret 
End Sub 

然後您可以參考Microsoft's Website來確定解算器爲什麼決定退出。

從那裏,您可以使用該信息來確定如何繼續。

+0

這是一個很好的提示,我試圖追上'SolverSolve'的值和值在第一次運行是 求解找到一個解決方案(時間之前結束一個)。所有約束條件和最優條件均得到滿足。 當我點擊'CommandButton'時,我得到了 1 Solver已經融合到了當前的解決方案中。所有約束條件都滿足。 我還不知道爲什麼會發生這種情況,有什麼想法? –