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 i

bonsoir,

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 i

bonjour 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 !

9test-forum.xlsm (111.26 Ko)

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
21test-forum.xlsm (105.81 Ko)

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

Rechercher des sujets similaires à "macro solveur boucle"