dimanche 29 janvier 2012

Ouvrir et fermer les palettes de couleurs

Sous Excel 2003, j’avais créé une macro pour me faciliter la manipulation des deux palettes de couleurs présentes en standard dans la barre d’outils “Mise en forme” : les couleurs de remplissage et les couleurs de police.


Cette macro n’a plus trop de sens sous Excel 2007 et Excel 2010, mais elle permet d’aborder ici quelques éléments simples et intéressants de VBA.


Sa création avait été motivée par un double constat :
1. avoir ces deux palettes ouvertes est bien utile lorsqu’on travaille sur des questions cosmétiques (remplissage de cellule ou mise en forme de texte, mais aussi mise en forme de graphique, aires, grille, histogrammes, courbes, etc). Cela dit, lorsqu’on n’en a pas besoin, elles sont gênantes et c’est alors mieux de les avoir fermées !
2. les manipuler à la souris est un peu long, mine de rien.
Pour ouvrir la palette des couleurs de remplissage par exemple, il faut :
- diriger le pointeur jusqu’à cette minuscule zone contenant un bout de flèche vers le bas (1 sur l’image ci-dessous),
- cliquer dessus,
- déplacer légèrement  le pointeur jusqu’à la mince poignée traversant le haut de la palette qui vient d’apparaître (2 sur l’image ci-dessous),
- attraper cette poignée en y maintenant enfoncé le bouton gauche de la souris,
- déplacer tout ça vers le bas (ou ailleurs, mais déplacer),
- et enfin relâcher le bouton de la souris (3 sur l’image ci-dessous).
Tout ça pour une palette, et il y en a une deuxième !

Bon, c’est anodin mais je trouve ça pénible si on doit le faire souvent. Et a fortiori quand on réalise un travail où on veut avoir alternativement les palettes ouvertes, puis fermées, puis ouvertes, puis fermées, etc.

D’où cette macro, que je déclenchais d’un raccourci clavier de deux touches. (Et que je continue d’utiliser lorsque je suis sous Excel 2003.)

Pour tout dire, dans la manip illustrée ci-dessus, on ne détache pas à proprement parler la palette ! Ceci n’est que l’interprétation de ce qu’on a l’impression de faire. Techniquement, ce sont deux objets distincts, avec une liaison “de bon sens” de l’un vers l’autre :
- il y a ce bouton sur la barre d’outils “Edition”, qui ouvre une palette de couleurs ;
- une autre palette existe (en permanence) en tant que barre de commande dédiée, et on peut choisir de la rendre visible ou non ;
- la manip ci-dessus est une astuce qui, à partir du bouton (de la barre d’outils “Edition”), permet d’afficher la barre de commande !

(Preuve de tout cela : lorsque la palette est “détachée”, il reste possible de l’ouvrir depuis la barre d’outils.)


Parlons maintenant VBA !

On va travailler avec les barres de commande suivantes, qui sont rattachées à l’objet Application :
- la palette des couleurs de remplissage :
Application.CommandBars("Fill Color")
- la palette des couleurs de police :
Application.CommandBars("Font Color")

On va utiliser la propriété Visible de ces barres de commandes. Cette propriété est booléenne : elle vaut True si la barre de commandes est visible, False si elle ne l’est pas. Et on va se servir de l’opérateur Not, qui permet d’obtenir la négation logique d’une valeur.

La base de la macro est donc ceci : (j’intègre ça dans un “bloc With”, pour éviter de répéter Application quatre fois en deux lignes.)

With Application
.CommandBars("Fill Color").Visible = Not .CommandBars("Fill Color").Visible
.CommandBars("Font Color").Visible = Not .CommandBars("Font Color").Visible
End With

Ce bout de code a pour effet d’inverser l’état de visbilité de chacune des deux palettes.


Cela étant, un problème se pose : si une palette est apparente et l’autre non, ce code rendra invisible la première, et rendra l’autre visible. Autrement dit, il y aura toujours une palette visible, mais jamais les deux ensembles ni aucune des deux.

Pour contourner ce problème, on harmonisera d’autorité la visibilité des deux palettes. Ceci revient à calquer d’abord la visibilité de l’une sur celle de l’autre :
With Application
.CommandBars("Fill Color").Visible = .CommandBars("Font Color").Visible
End With


Tout ça ensemble, et à l’intérieur d’un unique bloc With tant qu’à faire :

Sub OuvrirFermerPalettes()

With Application

 ' j’harmonise les niveaux de visibilité
 .CommandBars("Fill Color").Visible = .CommandBars("Font Color").Visible
 
 ' j'ouvre/ferme
 .CommandBars("Fill Color").Visible = Not .CommandBars("Fill Color").Visible
 .CommandBars("Font Color").Visible = Not.CommandBars("Font Color").Visible

End With

End Sub

Et voilà !

Aucun commentaire:

Enregistrer un commentaire