2015-05-20 2 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' и значение при первом запуске (тот, который заканчивается до того времени) является Solver нашел решение. Все условия и условия оптимальности выполнены. Когда я нажимаю «CommandButton», я получаю 1 Solver сходится к текущему решению. Все ограничения выполнены. Я до сих пор не знаю, почему это происходит, какие-то мысли? –

Смежные вопросы