2010-10-21 18 views
2

J'utilise le solveur intégré dans Excel 2003 dans une boucle VBA pour résoudre un certain nombre de problèmes différents. Parfois, le solveur atteint la limite de temps ou d'itérations maximale, ce qui entraîne l'apparition d'une boîte de dialogue contextuelle demandant si l'utilisateur souhaite continuer, arrêter ou terminer. Dans tous les cas, je veux que cela se termine, et passez à la ligne suivante de la boucle. Cela empêchera un utilisateur d'être obligé de s'asseoir et de répondre à chaque fois.Boîte de dialogue Catch max time/itération lors de l'utilisation d'Excel Solver dans VBA

Il semble que quelqu'un a pris un coup de poignard à elle, mais a échoué: http://www.excelforum.com/excel-programming/483175-catching-max-iterations-stop-of-solver-in-vba.html

Répondre

2

est ici une solution échantillon:

il utilise la méthode SolverSolve PassThru pour appeler une fonction pour gérer le résultat de solveur à chaque itération .

Option Explicit 

Sub SolverExample() 
    Dim results 

    ' Set up your solver here... 


    ' Execute solve 
    SolverOptions StepThru:=True 

    results = SolverSolve(True, "SolverIteration") 

    Select Case results 
    Case 0, 1, 2 
     ' solution found, keep final values 
     SolverFinish KeepFinal:=1 
    Case 4 
     'Target does not converge 
     'Your code here 
    Case 5 
     'Solver could not find a feasible solution 
     'Your code here 
    Case Else 
     'Your code 
    End Select 
End Sub 

Function SolverIteration(Reason As Integer) 
    ' Called on each solver iteration 

    Const SolverContinue As Boolean = False 
    Const SolverStop As Boolean = True 
    ' 
    Select Case Reason 
    Case 1 
     SolverIteration = False ' Continue 

    Case 2 
     ' Max Time reached 
     SolverIteration = True ' Stop 

    Case 3 
     ' Max Iterations reached 
     SolverIteration = True ' Stop 

    End Select 
End Function