Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Utilisation du solveur en boucle renvoie le message: "Solveur: une erreur est survenue, ou la mémoire disponible est saturée"

1 réponse
Avatar
Mathieu Fournier
Bonjour à tous,

Dans Excel 2003 (Windows XP), je tente d'utiliser le solveur à partir d'une
macro pour résoudre une formule qui fait référence à son propre résultat. La
formule est inclue dans une colonne d'une table de données et doit être
résolue pour chaque ligne de la table.

Lorsque je démarre la procédure, la macro s'arrete en cours d'éxecution et
Excel me renvoie le message: "Solveur: une erreur est survenue, ou la
mémoire disponible est saturée".

En tentant de résoudre le problème, j'ai découvert que le simple fait
d'ouvrir la boite de saisie des paramètres du Solveur via le menu
Outil/Solveur... et de la refermer sans avoir modifié quoi que ce soit règle
le problème!?! Après coup, la procédure peut-être utilisée sans aucun
problème. ceci me laisse perplexe.

Il semble que le simple fait d'ouvrir la boite de saisie des paramètres du
Solveur via le menu Outil/Solveur... active certains paramètres du Solveur
qui sont nécessaires à la résolution de mon problème.

Voici le code VBA de ma procédure:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$B$2" Then
Dim i As Long 'declare variable i loop
Dim x As Long 'declare variable x row
' A loop that will solve the equation for the 26 rows of my table.
i = 1
For i = 1 To 26
x = i + 6 'set row number
' Set up the parameters for the model.
' Set the target cell Ex to a maximum value by changing cell
Fx.
SolverReset
' Add constraint: Ex = Fx.
SolverAdd CellRef:=Cells(x, 5).Address, Relation:=2, _
FormulaText:=Cells(x, 6).Address
SolverOK SetCell:=Cells(x, 5).Address, MaxMinVal:=1, _
ByChange:=Cells(x, 6).Address
' Solve the model but do not display the Solver Results
dialog box.
SolverSolve UserFinish:=True
' Delete constraint: Ex = Fx.
SolverDelete CellRef:=Cells(x, 5).Address, Relation:=2, _
FormulaText:=Cells(x, 6).Address
' Finish and keep the final results.
SolverFinish KeepFinal:=1
Next i
End If
End Sub


Est-ce que quelqu'un aurait une idée géniale pour que ma procédure
fonctionne du premier coup? (sans avoir à ouvrir la boite de saisie des
paramètres du Solveur via le menu Outil/Solveur...)


Toute suggestion sera appréciée,

Mathieu

1 réponse

Avatar
Mathieu Fournier
J'ai obtenu la solution a ce probleme sur le newsgroup
"microsoft.public.excel.programming", merci a Tushar Mehta pour la reponse:

Somewhere along the way (2000? 2002?), something happened between the
XL VBA and Solver interface. Now, it appears one must force Solver to
'initialize' itself. Stick in a SOLVER.Auto_open before the For loop.

Also, note that embedding a Solver optimization inside the
Worksheet_Change procedure is a prescription to a guaranteed disaster.
It will result in an infinite recursive loop -- or, if you are unlucky,
in wrong results. How? Think of this: how did the code in the
procedure get started? When you call Solver, what will it do? Change
something in the worksheet, right? What will XL do because of that?
And, you will be...back where?

The common solution is to set EnableEvents to False. But, I don't know
how Solver operates to confidently say that it would be safe to do so.
That leaves you with a self implemented switch. Something along the
lines of:

Option Explicit
Dim AlreadyBusy As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
If AlreadyBusy Then Exit Sub '<<<<<
AlreadyBusy = True
On Error GoTo ErrXIT
'do my stuff
AlreadyBusy = False
Exit Sub
ErrXIT:
'clean up the results of the error
AlreadyBusy = False
End Sub

But, honestly, you are best off not embedding solver optimizations
inside worksheet change (or calculate or selectionchange or any such)
events.

--
Regards,

Tushar Mehta
www.tushar-mehta.com
Excel, PowerPoint, and VBA add-ins, tutorials
Custom MS Office productivity solutions


"Mathieu Fournier" wrote in message
news:%
Bonjour à tous,

Dans Excel 2003 (Windows XP), je tente d'utiliser le solveur à partir
d'une macro pour résoudre une formule qui fait référence à son propre
résultat. La formule est inclue dans une colonne d'une table de données et
doit être résolue pour chaque ligne de la table.

Lorsque je démarre la procédure, la macro s'arrete en cours d'éxecution et
Excel me renvoie le message: "Solveur: une erreur est survenue, ou la
mémoire disponible est saturée".

En tentant de résoudre le problème, j'ai découvert que le simple fait
d'ouvrir la boite de saisie des paramètres du Solveur via le menu
Outil/Solveur... et de la refermer sans avoir modifié quoi que ce soit
règle le problème!?! Après coup, la procédure peut-être utilisée sans
aucun problème. ceci me laisse perplexe.

Il semble que le simple fait d'ouvrir la boite de saisie des paramètres du
Solveur via le menu Outil/Solveur... active certains paramètres du Solveur
qui sont nécessaires à la résolution de mon problème.

Voici le code VBA de ma procédure:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$B$2" Then
Dim i As Long 'declare variable i loop
Dim x As Long 'declare variable x row
' A loop that will solve the equation for the 26 rows of my table.
i = 1
For i = 1 To 26
x = i + 6 'set row number
' Set up the parameters for the model.
' Set the target cell Ex to a maximum value by changing
cell Fx.
SolverReset
' Add constraint: Ex = Fx.
SolverAdd CellRef:Îlls(x, 5).Address, Relation:=2, _
FormulaText:Îlls(x, 6).Address
SolverOK SetCell:Îlls(x, 5).Address, MaxMinVal:=1, _
ByChange:Îlls(x, 6).Address
' Solve the model but do not display the Solver Results
dialog box.
SolverSolve UserFinish:=True
' Delete constraint: Ex = Fx.
SolverDelete CellRef:Îlls(x, 5).Address, Relation:=2, _
FormulaText:Îlls(x, 6).Address
' Finish and keep the final results.
SolverFinish KeepFinal:=1
Next i
End If
End Sub


Est-ce que quelqu'un aurait une idée géniale pour que ma procédure
fonctionne du premier coup? (sans avoir à ouvrir la boite de saisie des
paramètres du Solveur via le menu Outil/Solveur...)


Toute suggestion sera appréciée,

Mathieu