Boucle VBA pour Solveur (ex simple cijoint)

Résolu/Fermé
Valoche01 Messages postés 43 Date d'inscription jeudi 29 novembre 2012 Statut Membre Dernière intervention 22 août 2017 - 2 déc. 2012 à 22:23
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 - 3 déc. 2012 à 18:47
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

eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 210
3 déc. 2012 à 00:25
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
Valoche01 Messages postés 43 Date d'inscription jeudi 29 novembre 2012 Statut Membre Dernière intervention 22 août 2017
3 déc. 2012 à 00:41
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
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 210
3 déc. 2012 à 00:57
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
0
Valoche01 Messages postés 43 Date d'inscription jeudi 29 novembre 2012 Statut Membre Dernière intervention 22 août 2017
3 déc. 2012 à 02:55
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
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 210
3 déc. 2012 à 10:52
Bonjour,

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

eric
0
Valoche01 Messages postés 43 Date d'inscription jeudi 29 novembre 2012 Statut Membre Dernière intervention 22 août 2017
3 déc. 2012 à 11:12
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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 210
3 déc. 2012 à 11:46
non, K est le n° de la colonne
col G = 7
0
Valoche01 Messages postés 43 Date d'inscription jeudi 29 novembre 2012 Statut Membre Dernière intervention 22 août 2017
3 déc. 2012 à 11:56
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
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 210
3 déc. 2012 à 12:50
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
0
Valoche01 Messages postés 43 Date d'inscription jeudi 29 novembre 2012 Statut Membre Dernière intervention 22 août 2017
Modifié par Valoche01 le 3/12/2012 à 13:11
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
0
Valoche01 Messages postés 43 Date d'inscription jeudi 29 novembre 2012 Statut Membre Dernière intervention 22 août 2017
Modifié par Valoche01 le 3/12/2012 à 16:20
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://forums.commentcamarche.net/forum/affich-12459437-contraintes-de-solver-dans-macro-vba-excel
0
Valoche01 Messages postés 43 Date d'inscription jeudi 29 novembre 2012 Statut Membre Dernière intervention 22 août 2017
3 déc. 2012 à 16:39
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.
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 210
3 déc. 2012 à 18:47
Bien vu ;-)
0