[Excel-VB] Macro selection cellules variables

Résolu/Fermé
Signaler
-
Messages postés
10618
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
2 décembre 2021
-
Bonjour,
J'ai des listes déroulantes et quand une valeur de la liste est choisie cela me met des cellules en fond rouge. Evidement lorsqu'on change la valeur de la liste déroulante c'est d'autre cellules qui deviennent rouge. J'aimerai selectionner ses cellules pour pouvoir les intégrer dans les "cellules variables" du solveur excel mais je bloque un peu.
J'ai tenté une approche avec le code ci-dessous sans succes.

For Each Cell In Sheets("Feuil1").Range("B2:D16")
If Cell.Interior.Color = 255 Then
SolverOK SetCell:=Range("J2"), MaxMinVal:=3, ValueOf:=0,
ByChange:=Cell.Value
End If
Next

Malgré les differents sujets sur le net je n'arrive pas a adapter les formules pour mon cas. Si quelqu'un peut m'aider merci.

16 réponses

Messages postés
10618
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
2 décembre 2021
1 239
Bonjour,
Pouvez-vous mettre un exemple sur https://www.cjoint.com/ et postez le lien afin de comprendre se que vous voulez obtenir ?
Bonjour,

Voila le lien ou on peut récupérer le fichier : https://www.cjoint.com/?lCwiIyxJPr

J'ai changé ma macro en :

SolverReset
On Error Resume Next
Dim Plage As Range
Dim Cel As Range
Set Plage = Range("B2:D16").Find("")
For Each Cel In Range("A1:D" & Range("D16").End(xlUp).Row)
If Cel.Interior.Color = "255" Then Set Plage = Union(Plage, Cel)
Next
SolverOK SetCell:=Range("J2"), MaxMinVal:=3, ValueOf:=0, ByChange:=Plage
SolverAdd CellRef:=Range("J2:J4,J6:J8"), Relation:=2, FormulaText:=0
SolverSolve UserFinish:=True


Mais lorsque j'execute la macro la selection d'adresse de mes cellules se retrouvent dans mes cellules a fond rouge et rien n'est pris en compte dans le solveur.
Messages postés
10618
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
2 décembre 2021
1 239
Bonjour,
Merci pour message.
Il m’est impossible d’exécuter votre code car j’ai une erreur de compilation qui correspond à une référence manquante [Solver.xlam].
De plus je n’arrive pas à comprendre se que vous voulez obtenir ?
Bonjour,

Tout d'abord merci pour de vous pencher sur mon probleme. la référence qu'il vous manque c'est probablement le solveur qui n'est pas activé. Je suis sous Excel 2007 pour l'activer il faut aller dans option d'excel > compléments puis cliquer sur atteindre et activer le complement solveur. Si vous avez des problemes pour l'activer en cherchant sur google "activer solveur excel" il y a un lien microsoft pour les differentes versions.

Donc pour revenir a mon probleme, en fonction de la valeur de ma liste déroulante les cellules avec le fond rouge change ne sont pas au meme endroit. Je me sers du solveur afin de resoudre des equations et les cellules a fond rouge representent mes inconnues. Afin d'automatiser le processus, je voudrai à l'aide d'une macro lancer la resolution mais je n'arrive pas à selectionner les adresses des cellules rouge pour ensuite les coller dans la ligne "cellules variables" du solveur.

J'espere avoir été assez précis.
Messages postés
10618
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
2 décembre 2021
1 239
Bonjour,
Merci pour vos informations.
Le problème du [Solveur] est réglé.
J’ai enfin compris se que vous désirez réaliser à l’aide du solveur. Le temps de comprendre comment fonctionne le solveur et ensuite la procédure sera plus facile à maitrisée.
Je pense pour demain.
Messages postés
10618
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
2 décembre 2021
1 239
Bonjour,
Est-ce que mon interprétation est correcte :
Cellule cible à définir : [ J2 ] (formule : =B2+B6+B10+B14)
Egale à : Valeur = 0
Cellules variable : les rouges (pour Torseur A, Pivot : [B2])
Contrainte : pas déterminer
Messages postés
10618
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
2 décembre 2021
1 239
Bonjour,
J’ai modifié le code de votre procédure [Private Sub CommandButton1_Click()].
Il semble que cela fonctionne, je vous laisse voir : https://www.cjoint.com/?lDwbXcl5v1
Note: la valeur de [J2] est sur 12 !
Bonjour,

Encore merci pour ce que vous avez fait. J'ai essayé de faire un essai avec les données de mon problemes malheuresement mes inconnues affichent 0. Lorsque j'ouvre le solveur les contraintes ne s'ajoutent pas.
Enfin lorsque vous ecrivez CelRouge = Left(CelRouge, (Len(CelRouge) - 1)) a quoi cela correspond il ?

Merci.
> Eruel
Re bonjour,

j'ai finalement séparé en 2 lignes les contraintes :

SolverAdd CellRef:=Range("J2:J4"), Relation:=2, FormulaText:=0
SolverAdd CellRef:=Range("J6:J8"), Relation:=2, FormulaText:=0

au lieu de :

SolverAdd CellRef:=Range("J2:J4,J6:J8"), Relation:=2, FormulaText:=0

Je vais encore faire quelques test pour m'assurer que tout marche.

Encore merci !
Bonjour,
Une chose est étrange : en [J2] (qui est la cible) vous avez la valeur [0], donc les autres valeurs (celles en rouge) seront calculées pour obtenir [0] en [J2] et en plus vous donnez aux contraintes [J2 :J4, J6 :j8] aussi une valeur [0] se qui est étonnant si contient encore compte que [J2] valeur cible est aussi contrainte !

Mettez donc un exemple concret de résultat que vous devriez obtenir, 2 à 3 cas se qui permettrait de faire fonctionner correctement la procédure.

Je me repencherai sur votre problème en fin de journée.

Concernant ceci : Enfin lorsque vous écrivez CelRouge = Left(CelRouge, (Len(CelRouge) - 1)) a quoi cela correspond il ?Le solveur à besoin des adresses des cellules (rouge) j’ai donc la suite ["$B$2,$B$3,$B$4,$B$10,$B$11,$D$11,$B$12,$D$12,"] et je supprime la dernière virgule qui est en trop avec la fonction combinée [Left(CelRouge, (Len(CelRouge) - 1)) et j’ontiens la chaine correcte [["$B$2,$B$3,$B$4,$B$10,$B$11,$D$11,$B$12,$D$12"] pour les variables à calculer par le solveur.
Bonjour,

je vous ai mis comme demandé 2 exemples.
Dans le fichier zip j'ai mis un fichier texte à lire pour vous apporter quelques précisions.

http://www.cijoint.fr/cjlink.php?file=cj200911/cijbDbZ3B7.zip

Merci.
Merci Eruel,
C’est avec plaisir que je vais me pencher sur votre problème.
Bonjour Eruel,
Pouvez-vous essayer cette version : https://www.cjoint.com/?lEwNsemBbU
Bonjour,

J'ai testé le fichier et tout semble bien fonctionner. Il n'y a plus ce probleme de cellule vide apres qu'on lance le solveur. Si j'ai bien vu vous avez juste augmenté la plage de cellule ?
Bonjour Eruel,
Merci, je suis content que cela fonctionne correctement.
Je n’ai pas augmenté la plage de cellule, voir la suite.
Je vous suggère de modifier l’instruction pour trouver la dernière ligne du tableau car il n’est pas bien de se référer à la colonne [D] car il peut y avoir des vides selon votre choix du type de torseur D (la cellule rouge étant vide) surtout si l’on touche les 3 dernières lignes (14,15 et 16 dans votre cas). Donc voici la ligne corriger que vous pouvez utiliser :

For Each Cel In Range("A2:D" & Range("A500").End(xlUp).Row)

Note : à partir de [A500] on cherche la première ligne non vide vers le haut [End(xlUp)].
Bonjour,

j'ai effectué quelques tests et je me retrouve avec "des approximations" je vous joins le fichier avec quelques précisions. J'ai aussi ajouter une requete subsidiaire seulement si vous avez le temps et que vous ne trouvez pas cela fastidieux.

http://www.cijoint.fr/cjlink.php?file=cj200912/cijsIxP0zE.zip

Encore merci la macro m'a enlevé une épine du pied !
> Eruel
Bonjour,
Concernant les approximations, vous pensez à [1E-6] soit exactement en format scientifique 1.00E-6 qui représente la valeur 0.000001, si s’est bien cela il me semble que cette valeur peut être négligée en mécanique statique / calculs forces et moments et ceci n’influencera pas les résultats qui sont exprimés en nombre entier. Mettre le format des cellules [J2 :J8] sur Nombre et zéro décimale.
Si se n’est pas acceptable, vous me le faite savoir.
Pour la suite de votre demande, une réponse d’ici à demain.
> ponpon
Bonjour,

En ce qui concerne la ligne :

For Each Cel In Range("A2:D" & Range("A500").End(xlUp).Row)

Cela recherche les cellules que dans la colonne A ? Parce que dans mes exemples il est vrai que les inconnues sont dans cette colonne mais il se peut pour certains cas que des inconnues puissent être dans la colonne D.
Si je fais fausse route je ne vois pas pourquoi modifier Range("D500").End(xlUp).Row) en Range("A500").End(xlUp).Row) .

En ce qui concerne les approximation il est vrai que c'est négligeable mais je trouve cela plutôt disgracieux. Surtout que je ne comprend pas pourquoi il reste des approximations et desfois non pour les mêmes valeurs. On dirai que ça change en fonction de la macro.

Merci pour le temps que vous m'accordez.
Bonjour,
Question : pour quelle raison, toutes les formules de la feuille [Torseurs Cohésions], lignes 4, 5 et 6 commencent par un signe moins après le égal [=-(….)] ?

J’attends votre réponse pour continuer.

Concernant ceci :
Si je fais fausse route je ne vois pas pourquoi modifier Range("D500").End(xlUp).Row) en Range("A500").End(xlUp).Row) .
Je pense que vous n’avez pas compris mon explication du poste 15.
Les cellules de la colonne [D] peuvent être vide (en rouge) , exemple avec le choix [Pivot] pour le torseur D, de ce fait les lignes 15 et 16 ne sont pas prisent en compte par la procédure. Par contre la colonne [A ] (voir [C] ou [E] ) aura toujours le titre de la ligne et de ce fait la dernière ligne du tableau sera prise en compte.
Vous pouvez essayer en exécutant un pas à pas sur la procédure (au préalable, choix [Pivot] pour le torseur D et changer le [a500] en [D500] et vous constaterez de vos yeux que seul les cellules ["$B$2,$B$3,$B$4,$B$11,$B$12,$B$14"], soit manque celles de correspondantes aux lignes 15 et 16.
Bonjour,
Question : pour quelle raison, toutes les formules de la feuille [Torseurs Cohésions], lignes 4, 5 et 6 commencent par un signe moins après le égal [=-(….)] ?

J’attends votre réponse pour continuer.

Concernant ceci :
Si je fais fausse route je ne vois pas pourquoi modifier Range("D500").End(xlUp).Row) en Range("A500").End(xlUp).Row) .

Je pense que vous n’avez pas compris mon explication du poste 15.

Les cellules de la colonne [D] peuvent être vide (en rouge) , exemple avec le choix [Pivot] pour le torseur D, de ce fait les lignes 15 et 16 ne sont pas prisent en compte par la procédure. Par contre la colonne [A ] (voir [C] ou [E] ) aura toujours le titre de la ligne et de ce fait la dernière ligne du tableau sera prise en compte.
Vous pouvez essayer en exécutant un pas à pas sur la procédure (au préalable, choix [Pivot] pour le torseur D et changer le [a500] en [D500] et vous constaterez de vos yeux que seul les cellules ["$B$2,$B$3,$B$4,$B$11,$B$12,$B$14"], soit manque celles de correspondantes aux lignes 15 et 16.
Bonjour,
J’ai contrôlé vos formules qui sont correctes (mis à part du signe moins qui se trouve devant !).
Votre fichier : https://www.cjoint.com/?mcp5LzjLB0
Cela provient de la règles de vérification des erreurs, se qui est très bien pour attiré l’attention en cas de doute d’interprétation du système, Il vous suffit de dire au système d’ignorer l’erreur (clic droit sur l’icône danger et clic [Ignorer l’erreur].
Bonjour,

Tout à l'air de marcher pour le mieux je pense que le sujet est clos. Mais je n'en ai pas fini avec excel et je vais ouvrir un autre sujet sur les "cercles" car je n'ai pas trouvé la encore la solution.

En ce qui concerne le signe moins qui se trouve devant mes formules. Lorsque je prends par exemple AB je fais une "coupure" fictive dans ce segment et je dis que tout ce qui est avant la "coupure" c'est moins [les torseurs]. c'est la méthode que j'ai apprise (c'est des conventions).

Merci pour l'aide que vous m'avez apporté !
Bonjour,
Merci pour l’information.
Bonne continuation
Bonsoir,

"J'ai des listes déroulantes et quand une valeur de la liste est choisie cela me met des cellules en fond rouge. Evidement lorsqu'on change la valeur de la liste déroulante c'est d'autre cellules qui deviennent rouge. J'aimerai selectionner ses cellules pour pouvoir les intégrer dans les "cellules variables" du solveur excel mais je bloque un peu."

Après avoir passé pas mal de temps sur Excel pour créer un programme de Rdm, j'ai lu ce sujet rédigé par une connaissance, je lui ai demandé conseil, adapté sa macro... en vain!! Je m'en remet a vous en espérant trouver une solution assez rapidement. Présentation : demain 19h.

Le problème étant que lorsque je clique sur "résoudre pfs" les cases en rouges ne se remplissent pas...
A savoir:
-mes cases rouges se trouvent SUR les colonnes C et D et sont comprises entre les lignes 9 et 31.
-lorsque je sélectionne le nombre de torseurs, j'appelle un des 4 modules et lorsque ensuite je clique dans la case verte a coté du torseur dans chaque tableau j'appelle une autre macro

Voici mon fichier: http://www.cijoint.fr/cjlink.php?file=cj200912/cijQgPke8X.xl­sm

Par avance... merci!!!
Messages postés
10618
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
2 décembre 2021
1 239
Bonjour,
Votre solveur ne prend en compte que les cellules rouges.
Contrairement à votre énoncé : -mes cases rouges se trouvent SUR les colonnes C et D et sont comprises entre les lignes 9 et 31. , seul la plage C10:C11 est rouge pour le cas du torseur [Linéaire Annulaire].
Vos cellules orange ne seront donc pas prises en compte.
Merci pour votre réponse ( des plus rapide ) !!

Après être passé chez un ami pour essayer de résoudre le problème nous pensons avoir trouver la solution.
Est-ce par chance ou de par son esprit "méticuleux" et sa rigueur... qu'importe il semble qu'il manquait une valeur:

For Each Cel In Range("B9:E50" & Range("A50").End(xlUp).Row)
If Cel.Interior.Color = RGB(250, 192, 144) Then CelRouge = CelRouge + Cel.Address & ","
Next


En ce qui concerne le "rouge", c'était pour faire un test avec "l'exemple du web"...

J'espère ne plus avoir de soucis, une nuit blanche en prévision...

En espérant ne plus avoir a vous déranger ^^
Encore merci...
Messages postés
10618
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
2 décembre 2021
1 239
Bonjour,
Dans la ligne [For ...] vous devez chercher la première cellule pleine depuis le bas sur la colonne [B] car la colonne [A] est vide ! D’ou aucune plage détectée.
Vous devez avoir : (note: pas de 50 après le E, la valeur est déterminée par Range("B500").End(xlUp).Row)
For Each Cel In Range("B9:E" & Range("B500").End(xlUp).Row)

Le code RGB(250, 192, 144) est valable pour la couleur orange.


Salutations.
Jean-Pierre