Macro solveur en boucle
Bonjour,
Je sais que le sujet macro solveur est largement traité dans le forums, mais ma question porte sur son utilisation en boucle.
Je souhaite en effet dans une boucle appeler le solveur et stocker le résultat dans une certaine cellule ("DALLE - SYNTHESE & D & i").
Malheureusement, mon code "solveur" fonctionne tout seul, mais dans la boucle non. Si je modifie manuellement la donnée d'entrée ("Dalle - HU & E3") et que je lance la macro, le solveur ne s'exécute pas (je l'ai vérifié en faisant apparaître les résultats intermédiaires). Si quelqu'un a une idée, je suis preneur !
Merci (ci-dessous un morceau du code en question)
'Calculs TC Hauts
For i = 68 To 68
Worksheets("DALLE - Hu").Range("E3") = Worksheets("DALLE - SYNTHESE").Range("A" & i)
'open Solveur
SolverReset
Application.DisplayAlerts = False
SolverOk SetCell:=Worksheets("DALLE - Hu").Range("R9"), MaxMinVal:=3, ValueOf:=0, ByChange:=Worksheets("DALLE - Hu").Range("R8"), Engine:=1, EngineDesc:="GRG Nonlinear"
Worksheets("DALLE - Hu").Range("I10") = Worksheets("DALLE - Hu").Range("M3")
Worksheets("DALLE - Hu").Range("I11") = Worksheets("DALLE - Hu").Range("O3")
Worksheets("DALLE - SYNTHESE").Range("D" & i) = Worksheets("DALLE - Hu").Range("I16")
SolverSolve Userfinish:=True
Application.DisplayAlerts = True
'close Solveur
Next ibonsoir,
sans ton fichier difficile de comprendre quel est ton modèle, mais s'il s'agit de sauvegarder des résultats du modèle à chaque itération, ta macro ne me semble pas correcte. tu prépares le solver pour la ligne i, tu sauves le résultat (qui aurait dû être généré par le solveur) puis tu lances le solveur. il faut inverser les 2 dernières opérations donc ainsi
'Calculs TC Hauts
For i = 68 To 68
Worksheets("DALLE - Hu").Range("E3") = Worksheets("DALLE - SYNTHESE").Range("A" & i)
'open Solveur
SolverReset
Application.DisplayAlerts = False
'paramétrage du solver
SolverOk SetCell:=Worksheets("DALLE - Hu").Range("R9"), MaxMinVal:=3, ValueOf:=0, ByChange:=Worksheets("DALLE - Hu").Range("R8"), Engine:=1, EngineDesc:="GRG Nonlinear"
' lancement du solver
SolverSolve Userfinish:=True
' sauvegarde du résultat suite à l'exécution du solveur
'Worksheets("DALLE - Hu").Range("I10") = Worksheets("DALLE - Hu").Range("M3") 'je ne pense pas que ce soit utile
'Worksheets("DALLE - Hu").Range("I11") = Worksheets("DALLE - Hu").Range("O3") 'je ne pense pas que ce soit utile
Worksheets("DALLE - SYNTHESE").Range("D" & i) = Worksheets("DALLE - Hu").Range("I16")
Application.DisplayAlerts = True
'close Solveur
Next ibonjour H2SO4 et merci pour ta réponse je vais tester ça dans la journée et je reviens vers toi pour te dire le résultat
Re bonjour,
Merci pour ton avis mais je ne pense pas que ça vienne de là car le problème reste le même.
Pour les lignes où tu écris que ce n'est pas nécessaire, c'est juste que j'ai besoin que la macro récupère d'autres données pour d'autres calculs.
Pour plus de simplicité je mets un fichier épuré en PJ et je m'explique mieux :
Pour chaque ligne du tableau du premier onglet (dans l'exemple je n'ai mis que la cellule A68 pour le test), je voudrais que la macro récupère le nom de la cellule (ici SC-02i), le place dans le 3ème onglet en E3 (jusqu'ici mon code marche normalement).
Puis toutes les cellules (du 3ème onglet) F3 à T3 sont récupérées en fonction de ce qui est rentré en E3.
De là devrait se lancer le solveur, qui résout une certaine équation pour trouver e en cellule I16.
Le problème (j'y arrive enfin :-)) : si je rentre en E3 un exemple (SC-02i, j'arrive à e = 1.35). Si je rentre autre chose dans E3 (par exemple SC-02j), j'obtiens autre chose (en lançant la macro 2). Mais ensuite en lançant la macro 1 (et donc sur SC02-i rentré dans l'exemple), la macro ne retrouve jamais 1,35 (mais 1.17 dans le cas présenté)...
J'espère ne pas t'avoir perdu !
bonjour,
si j'ai bien compris,
Sub solverboucle()
Set wss = Sheets("dalle - synthese")
dl = wss.Cells(Rows.Count, 1).End(xlUp).Row
Sheets("dalle - hu").Activate
For i = 68 To dl
solverreset
Range("E3") = wss.Cells(i, 1)
SolverOk SetCell:="$R$9", MaxMinVal:=3, ValueOf:=0, ByChange:="$R$8", _
Engine:=1, EngineDesc:="GRG Nonlinear"
SolverSolve Userfinish:=True
wss.Cells(i, 4) = Range("I16")
Next i
End Sub
Bonjour H2SO4, et merci pour ton aide.
Effectivement, c'est bien ça que je voulais, j'ai légèrement modifié ton code (je n'avais pas besoin du dl puisque je ne recalcule pas toutes les cases).
L'erreur venait du Sheets("Nom_onglet"). Activate que je n'avais pas mis.
Encore merci et bonne journée