Mise en forme conditionnelle / Carte - Excel VBA
Bonjour
Dans le cadre d’un projet je souhaiterais mettre en forme une carte de l’Europe représentant l’implantation d’une PME sur le continent. Cette carte n’étant pas modifiable à l’aide d’une mise en forme conditionnelle, il me faut passer par VBA.
L’idée est de mettre à jour les pays suivant 3 scénarios :
Ventes réalisées (en vert) : il existe un potentiel dans le pays et l’entreprise a effectué des ventes (potentiel > 0; ventes > 0)
Opportunités (en bleu): il existe un potentiel de vente dans le pays mais l’entreprise n’est pas parvenue à vendre (potentiel > 0 ; ventes =0)
Pas d’opportunités (en rouge) aucune opportunité donc aucune vente (potentiel = 0 ; ventes = 0)
Pour commencer, j’ai commencé par sélectionner chaque pays sur la carte et à nommer la cellule par le nom du pays afin de faciliter l’écriture du code. Néanmoins, étant débutant sur VBA je ne parviens pas à obtenir le résultat escompté après avoir essayé une fonction SI dans VBA. Qqn aurait-il une idée du code le plus simple permettant d’obtenir de manière simple la carte recherchée ?
Je joins le document Excel qui permettra une meilleure compréhension de l’exercice.
Merci beaucoup d’avance pour votre aide
Bonjour,
Ce n'est pas très compliqué à faire une fois la situation apprêtée pour cela. Il faut commencer par lister les formes, les identifier, les renommer pour pouvoir produire rapidement le nom de chacune et y accéder...
On va donc commencer par les lister au moyen d'une macro afin de ne pas en louper.
A suivre...
Bonjour MFerrand
les formes étaient identifiées, mais je les ai remises en conformité avec les noms
Sub colorier()
For i = 2 To [A1].End(xlDown).Row
ActiveSheet.Shapes.Range(Array(Cells(i, 1).Value)).Select
With Selection.ShapeRange.Fill
.Visible = msoTrue
.ForeColor.RGB = Cells(i, 4).Interior.Color
End With
Next
End Sub
Bonjour,
Je te joins mon programme et te laisse regarder un peu, tu pourrs me demander si tu ne comprends pas
Bonjour à tous,
Tout d'abord un grand merci pour votre réactivité.
@MFerrand J'ai tenté d'ajouter de nouveaux pays pour élargir l'exercice et je ne parviens pas à dépasser 20 pays. Sais-tu d'où cela peut venir ?
@Ausecour Le code me semble clair, j'ai simplement du mal à comprendre comment tu as fait correspondre le nom des formes (ex: Group Allemagne) à la ligne qui porte le nom du pays. En effet, j'ai tenté d'ajouter un pays, j'ai donc nommer la forme Group Portugal et ajouter une ligne dans mon tableau pour le pays sans aucun succès. Je suppose que le problème réside dans le listage des formes et leur nomination, pourrais-tu me donner quelques details sur ton processus ?
Merci beaucoup pour votre aide
TMN
Bonjour,
Je t'expliquerai mon processus avec joie
En fait je fais la liaison de la façon suivante :
Je renomme les groupes de forme (attention il faut des formes groupées, sinon il faudra me dire si tu veux renomer chaque forme individuellement du genre France 1, France2...)
Et dans le programme, je parcours les noms de pays que tu as dans ton fichier, et je colore les formes qui sont dans le groupe qui portent leur nom, pour France par exemple, je vais chercher l'ensemble des formes dans le groupe France, puis les colore une à une, il faut qu'elles soient groupées par contre, si tu essayes d'accéder à une forme seule qui n'est pas groupée, et que tu as renomé "Group Portugal", le programme plantera car il ne trouvera pas de Groupitems dans ton unique forme. C'est comme si tu cherchais à acheter de la farine dans une boucherie...
Egalement, je vais chercher les couleurs que tu as mis en fond pour les cellules, si il n'y a pas de couleur, alors le programme plante, car c'est un cas que je n'ai pas géré, je n'ai pas non plus fait de programme pour remettre la couleur grise par défaut
Du coup tu me diras si tu veux colorier des formes pas forcément groupées
Au passage, pour le fond et le résultat, tu devrais utiliser une fonction SI pour afficher le texte, et gérer les couleurs par une mise en forme conditionnelle, plus rapide à mettre à jour et plus sûr d'après moi, en revanche ça demanderait de changer un peu le code car on irait plus chercher la couleur de la cellule au même endroit. En effet, la couleur d'une cellule mise manuellement se trouve dans Range.Interior.color, la mise en forme conditionnelle est dans Range.displayFormat.interior.color ou quelque chose dans ce genre
EDIT: Je t'ai joins une version modifiée avec l'Espagne pour que tu puisses voir, attention quand tu renommes un groupe, valide avec Entrée, sinon ça ne change pas le nom du groupe...
Hello Ausecour,
Merci pour ta réactivité
J'ai bien compris la problématique lié au nommage des formes. La difficulté est que dans certains cas comme la France il s'agit effectivement de groupes, en revanche pour le Portugal c'est une forme simple. Mon but étant d'ajouter d'autres pays de l'Europe que ceux initialement fournis dans mon fichier. Par conséquent, il serait sans doute obligatoire de décliner pour le groupe France (France 1, France 2) et l'intégrer dans mon tableau quitte à masquer les cellules ?
Très bon conseil pour la fonction SI afin d'afficher le texte ce qui m'a permis d'insérer une mise en forme conditionnelle. J'ai mis à jour mon fichier, j'attends ton conseil pour renommer les formes qui ne sont pas des groupes
Encore grand merci à vous tous pour votre aide précieuse!
TMN
C'est à moi ou à MFerrand que tu t'adresses ? sinon quel est ton retour sur ma proposition https://forum.excel-pratique.com/viewtopic.php?p=694559#p694559 ?@MFerrand J'ai tenté d'ajouter de nouveaux pays pour élargir l'exercice et je ne parviens pas à dépasser 20 pays. Sais-tu d'où cela peut venir ?
Hello Ausecour,
Merci pour ta réactivité
J'ai bien compris la problématique lié au nommage des formes. La difficulté est que dans certains cas comme la France il s'agit effectivement de groupes, en revanche pour le Portugal c'est une forme simple. Mon but étant d'ajouter d'autres pays de l'Europe que ceux initialement fournis dans mon fichier. Par conséquent, il serait sans doute obligatoire de décliner pour le groupe France (France 1, France 2) et l'intégrer dans mon tableau quitte à masquer les cellules ?
Très bon conseil pour la fonction SI afin d'afficher le texte ce qui m'a permis d'insérer une mise en forme conditionnelle. J'ai mis à jour mon fichier, j'attends ton conseil pour renommer les formes qui ne sont pas des groupes
Encore grand merci à vous tous pour votre aide précieuse!
TMN
Rebonjour,
Voici le fichier avec le programme modifié, tu verras que ça marche, j'en ai profité pour faire un programme qui format les couleurs de la carte, et j'ai mis deux boutons pour appeler les 2 programmes
Bonjour, Salut à tous !
J'ai fait une bonne révision de géographie...
Bilan sur le renommage des formes :
63 formes (groupes ou formes demeurées individualisées) si je me souviens bien (j'ai supprimé la feuille sur laquelle j'ai travaillé...
J'ai supprimé 11 formes qui ne présentaient aucune correspondances significative...
J'ai maintenu 3 formes sans les renommer (ont échappées peut-être à des regroupements ?), qui correspondent à Jersey, Guernesey, et l'île de Man (les îles anglo-normandes ne sont pas visibles, mais Man l'est si on grossit suffisamment).
Les autres formes (ou groupes), correspondant donc aux pays, je les ai renommées suivant 2 modèles :
- 3 premières lettres du nom (nom en un mot), avec une exception pour la Slovaquie (Slq) et la Slovénie (Sln) qui auraient fait doublon (c'est donc pour ce cas, le 2 premières et la 6e lettres)
- pour les noms composés, 2 lettres, la première et celle qui suit le trait d'union (les deux majuscules en fait).
Certains pays seront difficiles à voir ou demeureront invisibles malgré grossissement :
- le cas notable est Malte, que je ne suis pas arrivé à rendre visible, bien qu'il devrait pouvoir l'être...
(il faudra s'y repencher en cas de besoin) ; - pour Saint-Marin et le Vatican (si, si ! il figure, sur l'emplacement de Rome
) pas de visibilité ; - mais on pourra détecter le Liechtenstein et Andorre en grossissant, et Chypre sans problème ;
- pour les autres pas de problème de visibilité, mais noter que sont tronqués : l'Islande, la Russie (bien sûr), et l'Azerbaïdjan et le Kazakhstan).
Les procédures (attachées à des boutons ActiveX) :
Private Sub cbColor_Click()
Dim shp$, c%, i%, clr
clr = Array(vbRed, RGB(0, 112, 192), RGB(0, 176, 80))
With Me.Range("A1")
For i = 2 To .End(xlDown).Row
c = InStr(1, .Cells(i, 1), "-")
If c = 0 Then
shp = Left(.Cells(i, 1), 3)
If shp = "Slo" Then shp = Replace(shp, "o", Mid(.Cells(i, 1), 6, 1))
Else
shp = Mid(.Cells(i, 1), 1, 1) & Mid(.Cells(i, 1), c + 1, 1)
End If
c = Abs((.Cells(i, 2) > 0) + (.Cells(i, 3) > 0))
Me.Shapes(shp).Fill.ForeColor.RGB = clr(c)
Next i
End With
End Sub
Private Sub cbRéinit_Click()
Dim shp As Shape, clr As Long
clr = RGB(191, 191, 191)
For Each shp In Me.Shapes
If shp.Name <> "Oval" Then shp.Fill.ForeColor.RGB = clr
Next shp
End SubPour la coloration, on définit un tableau des 3 couleurs utilisées, d'indice 0 (rouge), 1 (bleu) et 2 (vert).
Le calcul de l'indice se fait sur les colonnes 2 et 3 du tableau (pour chaque ligne) en additionnant les valeurs booléennes sur la condition >0 (et en prenant la valeur absolue car en VBA, True = -1).
Le nom est récupéré dans une variable à partir du nom de pays selon les règles indiquées plus haut.
Et on parcourt la liste (qui pourra donc être augmentée) en colorant la forme concernée, de la couleur voulue.
La 2e procédure réinitialise en colorant toutes les formes en gris.
Cordialement.
Hello,
j'en rajoute une couche car j'aime bien les codes super courts !
Sub colorier()
For i = 2 To [A1].End(xlDown).Row
ActiveSheet.Shapes.Range(Array(Cells(i, 1).Value)).Select
Selection.ShapeRange.Fill.ForeColor.RGB = Cells(i, 4).Interior.Color
Next
Range("A1").Select
End Sub
Sub effacer()
For i = 2 To [A1].End(xlDown).Row
ActiveSheet.Shapes.Range(Array(Cells(i, 1).Value)).Select
Selection.ShapeRange.Fill.ForeColor.RGB = RGB(191, 191, 191)
Next
Range("A1").Select
End Subet puis je n'ai pas de retour sur ma contribution, cela me frustre, si si !
j'ai pas mal participé à https://the5k.org/ !!
Salut Steelson !
j'en rajoute une couche car j'aime bien les codes super courts !
Avec ShapeRange, tu allonges pourtant !
Bonne journée.
Tu as raison, merci pour cette remarque
Donc encore plus court !
Sub colorier()
For i = 2 To [A1].End(xlDown).Row
ActiveSheet.Shapes.Range(Array(Cells(i, 1).Value)).Fill.ForeColor.RGB = Cells(i, 4).Interior.Color
Next
End Sub
Sub effacer()
For i = 2 To [A1].End(xlDown).Row
ActiveSheet.Shapes.Range(Array(Cells(i, 1).Value)).Fill.ForeColor.RGB = RGB(191, 191, 191)
Next
End SubBonjour à tous,
Très honnêtement je suis impressionné par votre aide et votre réactivité. C'est tout simplement génial.
Merci à Steelson, MFerrand et Ausecour. Vous m'avez fournis des exemples très solides et je vais pouvoir analyser ça. Mon but est maintenant de tenter d'élargir ce projet à une carte du monde en utilisant vos conseils et en les mettant en application.
Je vais tester ça sur les prochains jours et vous tiendrai au courant.
Encore un enorme merci pour votre aide
TMN
Bonjour Steelson
J'ai tenté de mettre à jour les couleurs de la colonne 4 grâce à une fonction SI et une mise en forme conditionnelle. Pas de problème à ce niveau là, la cellule se met à la bonne couleur.
En revanche, la couleur n'est pas correctement prise en compte lors du coloriage de la carte. Le lien ne doit pas se faire dans ce cas, as-tu une idée de la combine à suivre pour y remédier ?
Merci encore pour votre aide,
TMN
Bonjour,
C'est ce que je t'avais dis à un moment, la couleur donnée par une mise en forme conditionnelle n'est pas stockée au même endroit qu'une couleur mise manuellement, je te joins le fichier corrigé :
En effet, la couleur de fond manuelle se trouve dans Cells.interior.color, la couleur d'une mise en forme conditionnelle se trouve dans Cells.DisplayFormat.Interior.Color
Bonjour, Salut à tous !
Je te signale à toutes fins utiles que pour ma part, je ne me suis pas préoccupé des couleurs de tes cellules, j'ai codé la coloration directement dans la procédure et indépendamment de tes cellules (en tant que code couleur prédéfini.
Et d'autre part, le renommage des shapes est réalisé globalement, selon des règles que j'ai indiquées, qui permet l'extension de la procédure à tous les pays de la carte, sans modification ultérieure. Soit tout est en place pour que la liste puisse être étendue, indépendamment de cellules colorées ou non, sans avoir à toucher à rien !
Cordialement.
En revanche, la couleur n'est pas correctement prise en compte lors du coloriage de la carte. Le lien ne doit pas se faire dans ce cas, as-tu une idée de la combine à suivre pour y remédier ?
En fait normal, car dans ce cas les couleurs sont données par une MFC et donc pas accessibles de la même façon. Ce qui n'était pas le cas dans le premier exemple sauf erreur de ma part.
Il faut donc tester les conditions entrant dans la MFC et en donner la même couleur.
Je regarde ce soir ...
En revanche, la couleur n'est pas correctement prise en compte lors du coloriage de la carte. Le lien ne doit pas se faire dans ce cas, as-tu une idée de la combine à suivre pour y remédier ?
En fait normal, car dans ce cas les couleurs sont données par une MFC et donc pas accessibles de la même façon. Ce qui n'était pas le cas dans le premier exemple sauf erreur de ma part.
Il faut donc tester les conditions entrant dans la MFC et en donner la même couleur.
Je regarde ce soir ...
Sinon j'ai réglé le soucis en prenant la couleur affichée par la mise en forme dans DisplayFormat, si jamais tu n'as pas vu le message, à moins que tu souhaites faire autre chose, je suis curieux