Boucle VBA pour Solveur (ex simple cijoint) [Résolu/Fermé]

Signaler
Messages postés
43
Date d'inscription
jeudi 29 novembre 2012
Statut
Membre
Dernière intervention
22 août 2017
-
eriiic
Messages postés
23346
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
7 avril 2020
-
Bonsoir ,

J'ai un petit soucis en VBA pour implémenter le solveur sur un exemple simple.
Lorsque je ne mets pas la contrainte, le code fonctionne, mais lorsque je la mets, il ne fonctionne plus. Savez-vous ce qui ne va pas?

Voici le fichier excel sans la macro (dsl je n'ai pas réussi à enregistrer le fichier avec la macro...) : http://cjoint.com/12dc/BLcvHj4Vo0l.htm

Voici ma macro que je place dans thisworkbook après avoir activé la fonction solver dans outils/références:

Sub solveurauto()
Dim K As Integer

For K = 2 To 4
    SolverOk SetCell:="I" & K, MaxMinVal:=2, ByChange:="G" & K
 
 SolverAdd CellRef:=Range("H") & K, Relation:=2, FormulaText:="20" & K
 
    SolverSolve Userfinish:=True
    
Next
End Sub


Merci pour votre aide!

7 réponses

Messages postés
23346
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
7 avril 2020
6 018
Bonsoir,

peut-être ça :
Sub solveurauto()
    Dim K As Integer
    For K = 2 To 4
        SolverOk SetCell:=Range("I" & K), MaxMinVal:=2, ByChange:=Range("G" & K)
        SolverAdd CellRef:=Range("H" & K), Relation:=2, FormulaText:="20"
        SolverSolve Userfinish:=True
    Next
End Sub 

Regarde de plus près FormulaText, je ne sais pas si tu veux 20 ou 20+K vu que tu avais mis : "20" & K

Une aide : https://support.microsoft.com/en-us/help/843304

eric
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 79446 internautes nous ont dit merci ce mois-ci

Valoche01
Messages postés
43
Date d'inscription
jeudi 29 novembre 2012
Statut
Membre
Dernière intervention
22 août 2017

Merci pour le lien, mais je l'ai déjà épluché aujourd'hui :)
Ecoute c'est nickel, c'était un problème de parenthèses bien vu !

Pour le FormulaText, je voulais faire 20 & K pour ne pas avoir a tirer la formule dans le tableau et que la contrainte se mette automatiquement mais en fait ça ne marche pas. Pas grave.

Merci beaucoup
eriiic
Messages postés
23346
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
7 avril 2020
6 018
c'était un problème de parenthèses
et de Range...

je voulais faire 20 & K

&, tu es sûr ? Et pas 20+K ?
remplace par : "20" & CStr(k)

Si c'est 20 + K que tu veux alors :
CStr(20 + k)

eric
Messages postés
43
Date d'inscription
jeudi 29 novembre 2012
Statut
Membre
Dernière intervention
22 août 2017

Merci pour ton aide eriiic, j'ai encore un petite question pour que tout soit propre !
Comment incrémenter les colonnes et non les lignes si je place mon tableau avec mon solveur dans l'autre sens? J'ai cherché un peu partout mais pas trouvé...

Je remets un fichier avec le tableau dans le sens définitif : http://www.cjoint.com/confirm.php?cjoint=BLdcLwOlFuk

Je sais que ma macro est fausse mais comment faire? (Sinon dans le pire des cas je peux mettre les chiffres en lignes et les lettres en colonne, je pense que ça marcherait mais je préfère garder l'agencement tel quel... )

Sub solveur()
   Dim K As Integer
    For K = G To H
        SolverOk SetCell:=Range("11" & K), MaxMinVal:=2, ByChange:=Range("9" & K)
        SolverAdd CellRef:=Range("10" & K), Relation:=2, FormulaText:="20"
        SolverSolve Userfinish:=True
    Next
End Sub


Merci bien
Messages postés
23346
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
7 avril 2020
6 018
Bonjour,

au lieu de Range("11" & K) utilises Cells(ligne,colonne)

eric
Messages postés
43
Date d'inscription
jeudi 29 novembre 2012
Statut
Membre
Dernière intervention
22 août 2017

Merci pour ta réponse, j'ai essayé mais je n'y arrive pas...

Sub solveur()
   Dim K As Integer
    For K = G To H
        SolverOk SetCell:=Cells(11, K), MaxMinVal:=2, ByChange:=Cells(9, K)
        SolverAdd CellRef:=Cells(10, K), Relation:=2, FormulaText:="20"
        SolverSolve Userfinish:=True
    Next
End Sub


On peut vraiment incrémenter des lettres?
Messages postés
23346
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
7 avril 2020
6 018
non, K est le n° de la colonne
col G = 7
Messages postés
43
Date d'inscription
jeudi 29 novembre 2012
Statut
Membre
Dernière intervention
22 août 2017

Suis-je bête ! Merci pour l'info ! J'y suis presque mais ça ne marche toujours pas, le solveur avance bien en colonne mais ne résoud rien, c'est bizarre

Sub solveur()
   Dim K As Integer
    For K = 0 To 4
    
        SolverOk SetCell:=Cells(11, 7 + K), MaxMinVal:=2, ByChange:=Cells(9, 7 + K)
        SolverAdd CellRef:=Cells(10, 7 + K), Relation:=2, FormulaText:="20"
        SolverSolve Userfinish:=True
    Next
End Sub
Messages postés
23346
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
7 avril 2020
6 018
Tu ne t'es pas trompé entre surface et périmètre ?
De plus pourquoi avoir une ligne périmètre puisque tu ne te sers pas de la cellule vu que tu as mis en dur dans le code =20 ?

eric
Valoche01
Messages postés
43
Date d'inscription
jeudi 29 novembre 2012
Statut
Membre
Dernière intervention
22 août 2017

Oui en fait je voulais prendre un exemple très simple avec une seule contrainte pour qu'on se comprenne mieux, mais du coup le périmètre n'est pas "minimisé" vu que j'ai bloqué la surface et une longueur... Enfin l'idée est là et ça fonctionne quand j'incrémente en ligne, mais en colonne je n'y arrive pas

voilà le fichier qui fonctionne en incrémentant en ligne : http://www.cjoint.com/confirm.php?cjoint=BLdnh0agRwZ

Et celui que tu as (avec la mise à jour de tes modifs), qui ne marche pas en colonne : http://www.cjoint.com/confirm.php?cjoint=BLdnjvKuZD5

Merci pour le temps que tu m'accordes, j'apprecie beaucoup
Valoche01
Messages postés
43
Date d'inscription
jeudi 29 novembre 2012
Statut
Membre
Dernière intervention
22 août 2017

J'ai réussi ! Merci énormément à toi eriiic
J'ai repris un exemple simple et plus adéquat avant de l'appliquer à mon gros solveur.
Voici un exemple de boucle de solveur avec une macro solveur ligne et une macro solveur colonne pour ceux que ça intéresse.

http://www.cjoint.com/confirm.php?cjoint=BLdqlrgsSwT

Il me reste à comprendre pourquoi lorsque l'on met des contraintes en vba, que l'on compile plusieurs fois, parfois ça ne marche plus et quand on ouvre le solveur sans Visual Basic, on se rend compte qu'on a plein de contraintes en double etc. Il suffit de faire rétablir tout, et ça remarche à nouveau sous VBA... Si quelqu'un à la réponse?

J'ai exactement le même problème qu'ici : https://www.commentcamarche.net/forum/affich-12459437-contraintes-de-solver-dans-macro-vba-excel
Valoche01
Messages postés
43
Date d'inscription
jeudi 29 novembre 2012
Statut
Membre
Dernière intervention
22 août 2017

Je suis vraiment trop nul lol bon j'ai trouvé la réponse, il faut mettre un solverdelete après le solveradd et avant le solversolve, comme celui-ci pour mon incrémentation en colonne : SolverDelete CellRef:=Cells(2, 2 + K), Relation:=1, FormulaText:="50"
ça supprimera toutes les contraintes qui se seront ajouté dans le solveur.

Valentin.
eriiic
Messages postés
23346
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
7 avril 2020
6 018
Bien vu ;-)