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

Portabilité de macro utilisant le solveur

14 réponses
Avatar
Eric S
Bonjour,

Il y a un certain temps, j'ai fait une feuille excel avec une macro VBA
utilisant le solveur. J'ai récemment changé de PC en conservant les
mêmes versions de windows et de office. Mais la macro ne marche plus
directement. Pourtant, j'ai bien installé le Solveur dans les Macro
complémentaires. Ce qui se passe:
- je clique sur le fichier
- excel s'ouvre
- sur la fenêtre de sécurité, je clique sur Activer les macros
- Microsoft Visual Basic s'ouvre et m'annonce une erreur de compilation
(Librairie manquante)
- je vais dans Outils|Références... là, il y a MANQUANT : SOLVER.XLA
- je vois en dessous qu'il le cherche dans
C:\Program Files\Microsoft Office\Office\MacroLib\Solveur\
Manque de chance, dans ma nouvelle installation, solver.xla est dans
C:\Program Files\Microsoft Office\Office10\MacroLib\Solver\
- si j'indique le nouveau chemin, ça marche.

Comment faire pour qu'il trouve automatiquement SOLVER.XLA quelque soit
l'installation de Office sur le PC où c'est déployé?

Eric

10 réponses

1 2
Avatar
michdenis
Tu dois décocher toutes les références marquées manquantes
dans la fenêtre de l'éditeur de code.(barre des menus / outils / référence...
Ferme la fenêtre
et tu ré-ouvres la même fenêtre et tu ajoutes la référence Solver.xla
Son chargement devrait être correcte et indiqué le bon chemin de la référence.




"Eric S" a écrit dans le message de groupe de discussion :
496f7d8e$0$24399$
Bonjour,

Il y a un certain temps, j'ai fait une feuille excel avec une macro VBA
utilisant le solveur. J'ai récemment changé de PC en conservant les
mêmes versions de windows et de office. Mais la macro ne marche plus
directement. Pourtant, j'ai bien installé le Solveur dans les Macro
complémentaires. Ce qui se passe:
- je clique sur le fichier
- excel s'ouvre
- sur la fenêtre de sécurité, je clique sur Activer les macros
- Microsoft Visual Basic s'ouvre et m'annonce une erreur de compilation
(Librairie manquante)
- je vais dans Outils|Références... là, il y a MANQUANT : SOLVER.XLA
- je vois en dessous qu'il le cherche dans
C:Program FilesMicrosoft OfficeOfficeMacroLibSolveur
Manque de chance, dans ma nouvelle installation, solver.xla est dans
C:Program FilesMicrosoft OfficeOffice10MacroLibSolver
- si j'indique le nouveau chemin, ça marche.

Comment faire pour qu'il trouve automatiquement SOLVER.XLA quelque soit
l'installation de Office sur le PC où c'est déployé?

Eric
Avatar
Eric S
michdenis a écrit :
Tu dois décocher toutes les références marquées manquantes
dans la fenêtre de l'éditeur de code.(barre des menus / outils / référence...
Ferme la fenêtre
et tu ré-ouvres la même fenêtre et tu ajoutes la référence Solver.xla
Son chargement devrait être correcte et indiqué le bon chemin de la référence.



Il faut que tous les utilisateurs chez qui ça plante fassent ça?

En plus, je viens de faire l'essai. Quand je veux recocher l'option
Solveur, je suis incapable de le trouver dans la liste des références.

Eric
Avatar
michdenis
| Comment faire pour qu'il trouve automatiquement SOLVER.XLA quelque
| soit l'installation de Office sur le PC où c'est déployé?

Je n'avais pas vu la dernière partie de ta question:

Comme le fichier responsable est un fichier de macro complémentaire(xla),
ce dernier n'a pas de correspondance dans la base de registre de Windows.

Selon moi, la seule façon de charger cette référence est en utilisant la
méthode suivante, la méthode "AddFromGuid" n'étant pas disponible
pour la raison déjà énoncée.

ThisWorkbook.VBProject.References.AddFromFile _
"C:Program FilesMicrosoft OfficeOFFICE11BibliothèqueSOLVERSOLVER.XLA"

Tu dois alors développer une macro qui va rechercher le fichier Solver.xla sur le
disque dur ... en tenant compte que diverses configuration de Windows sont possibles.

Dans un deuxième temps, tu dois t'assurer qu'à la fermeture du classeur de faire
disparaître cette référence car si tu ouvres ton classeur et qu'excel ne la trouve pas
au même endroit où il l'a chargé, tout ton code ne sera pas fonctionnel... il y aura
une bibliothèque MANQUANTE. Amuse-toi bien.





"Eric S" a écrit dans le message de groupe de discussion :
496f7d8e$0$24399$
Bonjour,

Il y a un certain temps, j'ai fait une feuille excel avec une macro VBA
utilisant le solveur. J'ai récemment changé de PC en conservant les
mêmes versions de windows et de office. Mais la macro ne marche plus
directement. Pourtant, j'ai bien installé le Solveur dans les Macro
complémentaires. Ce qui se passe:
- je clique sur le fichier
- excel s'ouvre
- sur la fenêtre de sécurité, je clique sur Activer les macros
- Microsoft Visual Basic s'ouvre et m'annonce une erreur de compilation
(Librairie manquante)
- je vais dans Outils|Références... là, il y a MANQUANT : SOLVER.XLA
- je vois en dessous qu'il le cherche dans
C:Program FilesMicrosoft OfficeOfficeMacroLibSolveur
Manque de chance, dans ma nouvelle installation, solver.xla est dans
C:Program FilesMicrosoft OfficeOffice10MacroLibSolver
- si j'indique le nouveau chemin, ça marche.

Comment faire pour qu'il trouve automatiquement SOLVER.XLA quelque soit
l'installation de Office sur le PC où c'est déployé?

Eric
Avatar
Eric S
> Tu dois alors développer une macro qui va rechercher le fichier Solver.xla sur le
disque dur ...



Sauf que ça plante à l'ouverture de la feuille en essayant de compiler
les macros donc il n'y a aucune chance que je puisse exécuter une macro
de recherche avant le plantage... La boucle est bouclée.

Eric
Avatar
Eric S
Je crois que j'ai trouvé une piste très sérieuse :

http://peltiertech.com/Excel/SolverVBA.html
Avatar
michdenis
Bravo !

Merci pour ta trouvaille, ça fonctionne très bien même
si à la fin de l'exécution la référence "Solver" dans la
fenêtre de l'éditeur de code
barre des menus / outils / références / Solver n'est
pas cochée.

En français, cela va comme suit :

Dans le ThisWorkbook de ton classeur tu inscris :

Private Sub Workbook_Open()
CheckSolver
CheckSolverIntl
End Sub

Et dans un module Standard :
'-------------------------------------------
Function CheckSolver() As Boolean
'' Adjusted for Application.Run() to avoid Reference problems with Solver
'' Peltier Technical Services, Inc., Copyright © 2007. All rights reserved.
'' Returns True if Solver can be used, False if not.

Dim bSolverInstalled As Boolean

'' Assume true unless otherwise
CheckSolver = True

On Error Resume Next
' check whether Solver is installed
bSolverInstalled = Application.AddIns("Complément solveur").Installed
Err.Clear

If bSolverInstalled Then
' uninstall temporarily
Application.AddIns("Complément solveur").Installed = False
' check whether Solver is installed (should be false)
bSolverInstalled = Application.AddIns("Complément solveur").Installed
End If

If Not bSolverInstalled Then
' (re)install Solver
Application.AddIns("Complément solveur").Installed = True
' check whether Solver is installed (should be true)
bSolverInstalled = Application.AddIns("Complément solveur").Installed
End If

If Not bSolverInstalled Then
MsgBox "Solver not found. This workbook will not work.", vbCritical
CheckSolver = False
End If

If CheckSolver Then
' initialize Solver
Application.Run "Solver.xla!Solver.Solver2.Auto_open"
End If

On Error GoTo 0

End Function
'-------------------------------------------
'The function above works fine for English versions of Excel,
'but in other languages, the name of the add-in may not
'be "Solver Add-In". We have to be a bit more clever, and introduce
'a loop to check the filenames of all add-ins. The CheckSolverIntl
'function below calls two additional functions which perform the loops.
'This function still relies on Solver being named "solver.xla".
'If this is not the case, change the value of the constant sAddIn in
'this procedure, and please email me about it.
'-------------------------------------------
Function CheckSolverIntl() As Boolean
'' Adjusted for Application.Run() to avoid Reference problems with Solver
'' Adjusted for international versions of Excel
'' Peltier Technical Services, Inc., Copyright © 2008. All rights reserved.
'' Returns True if Solver can be used, False if not.

Dim bSolverInstalled As Boolean
Dim bAddInFound As Boolean
Dim iAddIn As Long
Const sAddIn As String = "solver.xla"

'' Assume true unless otherwise
CheckSolverIntl = True

On Error Resume Next
' check whether Solver is installed
bSolverInstalled = IsInstalled(sAddIn)
Err.Clear

If bSolverInstalled Then
' uninstall temporarily
bAddInFound = AddInInstall(sAddIn, False)
' check whether Solver is installed (should be false)
bSolverInstalled = IsInstalled(sAddIn)
End If

If Not bSolverInstalled Then
' (re)install Solver
bAddInFound = AddInInstall(sAddIn, True)
' check whether Solver is installed (should be true)
bSolverInstalled = IsInstalled(sAddIn)
End If

If Not bSolverInstalled Then
MsgBox "Solver not found. This workbook will not work.", vbCritical
CheckSolverIntl = False
End If

If CheckSolverIntl Then
' initialize Solver
Application.Run "Solver.xla!Solver.Solver2.Auto_open"
End If

On Error GoTo 0
End Function

'-------------------------------------------
Function IsInstalled(sAddInFileName As String) As Boolean
Dim iAddIn As Long

IsInstalled = False

For iAddIn = 1 To Application.AddIns.Count
With Application.AddIns(iAddIn)
If LCase$(.Name) = LCase$(sAddInFileName) Then
If .Installed Then
IsInstalled = True
End If
Exit For
End If
End With
Next
End Function

'-------------------------------------------
Function AddInInstall(sAddInFileName As String, bInstall As Boolean) As Boolean
Dim iAddIn As Long

For iAddIn = 1 To Application.AddIns.Count
With Application.AddIns(iAddIn)
If LCase$(.Name) = LCase$(sAddInFileName) Then
If .Installed <> bInstall Then
.Installed = bInstall
End If
AddInInstall = True ' True = add-in is listed
Exit For
End If
End With
Next
End Function
'-------------------------------------------




"Eric S" a écrit dans le message de groupe de discussion :
496fb528$0$14145$
Je crois que j'ai trouvé une piste très sérieuse :

http://peltiertech.com/Excel/SolverVBA.html
Avatar
michdenis
J'oubliais de mentionner comme dans l'exemple que
John Peltier donne, il faut faire appel à Application.Run
pour utiliser par la suite le solver car faut-il se rappeler
que la macro complémentaire n'est pas cocher dans la
fenêtre des références en vba... En conséquence nous ne
pouvons pas appeler les méthodes de la macro complémentaire
directement.

'-----------------------------------------------------
Sub SolverMacro3()
'
' SolverMacro3 Macro
' Macro fixed up by Jon Peltier
' Edited to use Application.Run to avoid reference problems
'
Application.Run "SolverReset"
Application.Run "SolverAdd", "$B$5:$B$6", 1, "4"
Application.Run "SolverOk", "$B$8", 1, "0", "$B$5:$B$6"
Application.Run "SolverSolve", True
End Sub
'-----------------------------------------------------




"michdenis" a écrit dans le message de groupe de discussion :

Bravo !

Merci pour ta trouvaille, ça fonctionne très bien même
si à la fin de l'exécution la référence "Solver" dans la
fenêtre de l'éditeur de code
barre des menus / outils / références / Solver n'est
pas cochée.

En français, cela va comme suit :

Dans le ThisWorkbook de ton classeur tu inscris :

Private Sub Workbook_Open()
CheckSolver
CheckSolverIntl
End Sub

Et dans un module Standard :
'-------------------------------------------
Function CheckSolver() As Boolean
'' Adjusted for Application.Run() to avoid Reference problems with Solver
'' Peltier Technical Services, Inc., Copyright © 2007. All rights reserved.
'' Returns True if Solver can be used, False if not.

Dim bSolverInstalled As Boolean

'' Assume true unless otherwise
CheckSolver = True

On Error Resume Next
' check whether Solver is installed
bSolverInstalled = Application.AddIns("Complément solveur").Installed
Err.Clear

If bSolverInstalled Then
' uninstall temporarily
Application.AddIns("Complément solveur").Installed = False
' check whether Solver is installed (should be false)
bSolverInstalled = Application.AddIns("Complément solveur").Installed
End If

If Not bSolverInstalled Then
' (re)install Solver
Application.AddIns("Complément solveur").Installed = True
' check whether Solver is installed (should be true)
bSolverInstalled = Application.AddIns("Complément solveur").Installed
End If

If Not bSolverInstalled Then
MsgBox "Solver not found. This workbook will not work.", vbCritical
CheckSolver = False
End If

If CheckSolver Then
' initialize Solver
Application.Run "Solver.xla!Solver.Solver2.Auto_open"
End If

On Error GoTo 0

End Function
'-------------------------------------------
'The function above works fine for English versions of Excel,
'but in other languages, the name of the add-in may not
'be "Solver Add-In". We have to be a bit more clever, and introduce
'a loop to check the filenames of all add-ins. The CheckSolverIntl
'function below calls two additional functions which perform the loops.
'This function still relies on Solver being named "solver.xla".
'If this is not the case, change the value of the constant sAddIn in
'this procedure, and please email me about it.
'-------------------------------------------
Function CheckSolverIntl() As Boolean
'' Adjusted for Application.Run() to avoid Reference problems with Solver
'' Adjusted for international versions of Excel
'' Peltier Technical Services, Inc., Copyright © 2008. All rights reserved.
'' Returns True if Solver can be used, False if not.

Dim bSolverInstalled As Boolean
Dim bAddInFound As Boolean
Dim iAddIn As Long
Const sAddIn As String = "solver.xla"

'' Assume true unless otherwise
CheckSolverIntl = True

On Error Resume Next
' check whether Solver is installed
bSolverInstalled = IsInstalled(sAddIn)
Err.Clear

If bSolverInstalled Then
' uninstall temporarily
bAddInFound = AddInInstall(sAddIn, False)
' check whether Solver is installed (should be false)
bSolverInstalled = IsInstalled(sAddIn)
End If

If Not bSolverInstalled Then
' (re)install Solver
bAddInFound = AddInInstall(sAddIn, True)
' check whether Solver is installed (should be true)
bSolverInstalled = IsInstalled(sAddIn)
End If

If Not bSolverInstalled Then
MsgBox "Solver not found. This workbook will not work.", vbCritical
CheckSolverIntl = False
End If

If CheckSolverIntl Then
' initialize Solver
Application.Run "Solver.xla!Solver.Solver2.Auto_open"
End If

On Error GoTo 0
End Function

'-------------------------------------------
Function IsInstalled(sAddInFileName As String) As Boolean
Dim iAddIn As Long

IsInstalled = False

For iAddIn = 1 To Application.AddIns.Count
With Application.AddIns(iAddIn)
If LCase$(.Name) = LCase$(sAddInFileName) Then
If .Installed Then
IsInstalled = True
End If
Exit For
End If
End With
Next
End Function

'-------------------------------------------
Function AddInInstall(sAddInFileName As String, bInstall As Boolean) As Boolean
Dim iAddIn As Long

For iAddIn = 1 To Application.AddIns.Count
With Application.AddIns(iAddIn)
If LCase$(.Name) = LCase$(sAddInFileName) Then
If .Installed <> bInstall Then
.Installed = bInstall
End If
AddInInstall = True ' True = add-in is listed
Exit For
End If
End With
Next
End Function
'-------------------------------------------




"Eric S" a écrit dans le message de groupe de discussion :
496fb528$0$14145$
Je crois que j'ai trouvé une piste très sérieuse :

http://peltiertech.com/Excel/SolverVBA.html
Avatar
Eric S
Globalement, ça marche. Quelques remarques complémentaires:

Merci pour ta trouvaille, ça fonctionne très bien même
si à la fin de l'exécution la référence "Solver" dans la
fenêtre de l'éditeur de code
barre des menus / outils / références / Solver n'est
pas cochée.



Il est même important de supprimer la référence "Solver". Parce que si
l'ordinateur d'arrivée ne l'a pas, ça plante directe même si on utilise
Application.Run pour appeler le solveur dans les macros.

Private Sub Workbook_Open()
CheckSolver
CheckSolverIntl
End Sub



Je n'ai pas compris pourquoi il fallait les deux. Et si je laisse la
première macro, ça me renvoie un message d'erreur parce que je n'ai pas
"Complément solveur" dans les macros complémentaires mais "Complément
solver". La version internationale passe par contre à travers cette
subtile nuance.

Il n'y a plus qu'à tester à plus large échelle.

Eric
Avatar
michdenis
J'apporte une légère correction aux macros d'hier
parce que je me suis aperçu que le nom utilisé
dans la version Excel 2003 et avant est différent
de la version 2007

Ainsi :
de 1997 à 2003 : "Complément solveur" est devenu
en 2007 : "Complément solver" (ce que l'on voit dans
la fenêtre où l'on coche cette macro complémentaire
par l'interface de la feuille de calcul.

Le nom du addin est passé de "Solver.xla" à "Solver.xlam"

Avant de donner plus d'explication, on va attendre que quelques
usagers testent cette procédure. Moi, cela fonctionne très bien
avec Excel 2007 et Excel 2003 avec le système
d'exploitation Windows Vista.


Dans le ThisWorkbook de ton classeur tu inscris :
'--------------------------------------------------------------
Private Sub Workbook_Open()

If Val(Application.Version) > 11 Then
CheckSolver ("Complément Solver")
CheckSolverIntl ("Solver.xlam")
Else
CheckSolver ("Complément Solveur")
CheckSolverIntl ("Solver.xla")
End If

End Sub

'--------------------------------------------------------------
Function CheckSolver(Complement) As Boolean
'' Adjusted for Application.Run() to avoid Reference problems with Solver
'' Peltier Technical Services, Inc., Copyright © 2007. All rights reserved.
'' Returns True if Solver can be used, False if not.

Dim bSolverInstalled As Boolean

'' Assume true unless otherwise
CheckSolver = True

On Error Resume Next
' check whether Solver is installed
bSolverInstalled = Application.AddIns(Complement).Installed
Err.Clear

If bSolverInstalled Then
' uninstall temporarily
Application.AddIns(Complement).Installed = False
' check whether Solver is installed (should be false)
bSolverInstalled = Application.AddIns(Complement).Installed
End If

If Not bSolverInstalled Then
' (re)install Solver
Application.AddIns(Complement).Installed = True
' check whether Solver is installed (should be true)
bSolverInstalled = Application.AddIns(Complement).Installed
End If

If Not bSolverInstalled Then
MsgBox "Solver not found. This workbook will not work.", vbCritical
CheckSolver = False
End If

If CheckSolver Then
' initialize Solver
Application.Run "Solver.xla!Solver.Solver2.Auto_open"
End If

On Error GoTo 0

End Function
'--------------------------------------------------------------
'The function above works fine for English versions of Excel,
'but in other languages, the name of the add-in may not
'be "Solver Add-In". We have to be a bit more clever, and introduce
'a loop to check the filenames of all add-ins. The CheckSolverIntl
'function below calls two additional functions which perform the loops.
'This function still relies on Solver being named "solver.xla".
'If this is not the case, change the value of the constant sAddIn in
'this procedure, and please email me about it.

'--------------------------------------------------------------
Function CheckSolverIntl(SolverName As String) As Boolean
'' Adjusted for Application.Run() to avoid Reference problems with Solver
'' Adjusted for international versions of Excel
'' Peltier Technical Services, Inc., Copyright © 2008. All rights reserved.
'' Returns True if Solver can be used, False if not.

Dim bSolverInstalled As Boolean
Dim bAddInFound As Boolean
Dim iAddIn As Long

'' Assume true unless otherwise
CheckSolverIntl = True

On Error Resume Next
' check whether Solver is installed
bSolverInstalled = IsInstalled(SolverName)
Err.Clear

If bSolverInstalled Then
' uninstall temporarily
bAddInFound = AddInInstall(SolverName, False)
' check whether Solver is installed (should be false)
bSolverInstalled = IsInstalled(SolverName)
End If

If Not bSolverInstalled Then
' (re)install Solver
bAddInFound = AddInInstall(SolverName, True)
' check whether Solver is installed (should be true)
bSolverInstalled = IsInstalled(SolverName)
End If

If Not bSolverInstalled Then
MsgBox "Solver not found. This workbook will not work.", vbCritical
CheckSolverIntl = False
End If

If CheckSolverIntl Then
' initialize Solver
Application.Run "Solver.xla!Solver.Solver2.Auto_open"
End If

On Error GoTo 0
End Function
'--------------------------------------------------------------
Function IsInstalled(sAddInFileName As String) As Boolean
Dim iAddIn As Long

IsInstalled = False

For iAddIn = 1 To Application.AddIns.Count
With Application.AddIns(iAddIn)
If LCase$(.Name) = LCase$(sAddInFileName) Then
If .Installed Then
IsInstalled = True
End If
Exit For
End If
End With
Next
End Function
'--------------------------------------------------------------
Function AddInInstall(sAddInFileName As String, bInstall As Boolean) As Boolean
Dim iAddIn As Long

For iAddIn = 1 To Application.AddIns.Count
With Application.AddIns(iAddIn)
If LCase$(.Name) = LCase$(sAddInFileName) Then
If .Installed <> bInstall Then
.Installed = bInstall
End If
AddInInstall = True ' True = add-in is listed
Exit For
End If
End With
Next
End Function
'--------------------------------------------------------------






"Eric S" a écrit dans le message de groupe de discussion :
4970dfc3$0$23992$
Globalement, ça marche. Quelques remarques complémentaires:

Merci pour ta trouvaille, ça fonctionne très bien même
si à la fin de l'exécution la référence "Solver" dans la
fenêtre de l'éditeur de code
barre des menus / outils / références / Solver n'est
pas cochée.



Il est même important de supprimer la référence "Solver". Parce que si
l'ordinateur d'arrivée ne l'a pas, ça plante directe même si on utilise
Application.Run pour appeler le solveur dans les macros.

Private Sub Workbook_Open()
CheckSolver
CheckSolverIntl
End Sub



Je n'ai pas compris pourquoi il fallait les deux. Et si je laisse la
première macro, ça me renvoie un message d'erreur parce que je n'ai pas
"Complément solveur" dans les macros complémentaires mais "Complément
solver". La version internationale passe par contre à travers cette
subtile nuance.

Il n'y a plus qu'à tester à plus large échelle.

Eric
Avatar
michdenis
http://cjoint.com/?bsu7O0DNwJ

Sous windows vista, j'ai chargé dans ce fichier la macro
complémentaire Solver.xla.
Pour des fins de test, est-ce que d'autres usagers peuvent
télécharger ce fichier et nous dire si une erreur est engendré
du fait que vous ayez un système d'exploitation différent et
une hiérarchie différente de l'arborescence des fichiers dans
l'explorateur windows.




"Eric S" a écrit dans le message de groupe de discussion :
4970dfc3$0$23992$
Globalement, ça marche. Quelques remarques complémentaires:

Merci pour ta trouvaille, ça fonctionne très bien même
si à la fin de l'exécution la référence "Solver" dans la
fenêtre de l'éditeur de code
barre des menus / outils / références / Solver n'est
pas cochée.



Il est même important de supprimer la référence "Solver". Parce que si
l'ordinateur d'arrivée ne l'a pas, ça plante directe même si on utilise
Application.Run pour appeler le solveur dans les macros.

Private Sub Workbook_Open()
CheckSolver
CheckSolverIntl
End Sub



Je n'ai pas compris pourquoi il fallait les deux. Et si je laisse la
première macro, ça me renvoie un message d'erreur parce que je n'ai pas
"Complément solveur" dans les macros complémentaires mais "Complément
solver". La version internationale passe par contre à travers cette
subtile nuance.

Il n'y a plus qu'à tester à plus large échelle.

Eric
1 2