2015-05-20 32 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已经融合到了当前的解决方案中。所有约束条件都满足。 我还不知道为什么会发生这种情况,有什么想法? –