Excel求解器在find解决scheme之前就结束了 – VBA

我是VBA的初学者用户,我在Excel Solver中遇到了一些问题。

基本上我要计算几种金融工具的公允价值,按来源国分组。

对于每个国家,求解器将最小化一个函数以便find模型参数。

到目前为止,我已经能够做到这一点,在49个案例中,50个不同的国家/类别中的求解器工作。

这就是我的问题,当涉及到这个国家的解决者经过3或4次迭代后步出。 使目标function远未达到最小化。 但是当我点击一个命令button完全链接到相同的子程序,它find了一个解决scheme。

这里是我的代码的一部分,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 

任何想法如何解决这个问题? 求解器在从另一个子程序启动时没有find解决scheme,但是当它从一个命令button启动时,它就可以工作。

谢谢您的帮助

第一步是从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 

然后你可以咨询微软的网站,以确定为什么解决scheme决定退出。

从那里,您可以使用该信息来确定如何继续。