Bonjour à tous,
Etant actuellement en train de programmer un utilitaire qui contient une palette de couleurs, je suis amené à explorer la notion en VBA de ThemeColorScheme qui détermine (entre autres) la palette de couleurs utilisée dans le fichier Excel. Le but final est de reproduire la palette de couleurs (voir illustration) dans un userform en respectant le thème utilisé dans le fichier.
Il se peut que ce que je m'apprête à expliquer soit basique pour nombre d'entre vous mais comme je préfère donner trop de précisions que pas assez, je me permets d'être exhaustif Ayant en effet déjà bien avancé dans cette tâche et je me permets donc de vous faire part des différentes étapes que j'ai traversées avant d'arriver au problème qui me concerne.
Tout d'abord, il faut savoir qu'une palette de couleurs contient 10 couleurs de bases (ligne du haut de la palette) qui sont ensuite la base de 50 déclinaisons (5 par couleur de base). La palette contient ensuite dans la partie du bas 10 couleurs qui ne changent jamais.
Ces 50 déclinaisons sont générées en utilisant une seule et unique propriété : TintandShade, qui est compris entre -1 et 1. Lorsqu'elle est supérieure à 0 elle éclaircit la couleur, lorsqu'elle est inférieure à 0 elle l'assombrit.
Il y a donc trois étapes à franchir pour parvenir à reconstituer la palette de couleurs :
1 - Récupérer le code des 10 couleurs de base
2 - Récupérer pour chaque déclinaison la valeur de la propriété TintandShade appliquée à la couleur de base
3 - Déterminer un algorithme permettant d'obtenir le code couleur de la déclinaison en partant uniquement du code de la couleur de base et du TintandShade de cette déclinaison.
(Si l'élément d'un userform possédait les même propriétés que les "shapes" ou qu'une cellule, j'aurais simplement pu réappliquer la valeur ThemeColorIndex et TintandShade afin de reproduire la palette, sauf que l'élément d'un userform ne possède que la propriété BackColor ...)
Je suis parvenu après de nombreux efforts et tirages de cheveux à franchir avec succès les étapes 1 et 3.
Pour l'étape 2, j'ai basé mon développement sur l'observation que j'ai faite du thème classique d'Office. J'ai procédé de manière bête et méchante en reproduisant la palette de couleur du thème dans 60 cellules, et j'ai ensuite lu pour chaque cellule la propriété .TintandShade
Voici ce que j'ai obtenu (de gauche à droite de la palette, couleurs standards exclues)
Une fois mon algorithme au point, je parviens donc, après avoir récupérer le code des 10 couleurs de bases du thème actuellement utilisé sur le fichier, à reconstruire correctement la palette de couleur en me basant uniquement sur la valeur du TintandShade des déclinaisons en suivant le plan ci-dessus, que j'enregistre dans un array.
Or ! C'est ici que le bât blesse puisque après quelques tests je me suis aperçu que ce fameux plan peut évoluer d'un thème à l'autre. Les variations semblent relativement isolées mais elles existent. Le thème "Austin" s'appuie par exemple sur le plan suivant :
La différence est bien minime puisque la seule la colonne 3 diffère du plan classique d'Office.
Ce que je souhaite donc faire, c'est explorer en amont du lancement de mon algorithme le ThemeColorScheme utilisé dans le fichier pour enregistrer dans un array le plan des TintandShade utilisés pour construire le reste de la palette.
C'est une donnée qui existe (comme le montre l'illustration ci-dessus avec le Tip Texte qui renvoie la valeur du TintandShade de la déclinaison en %), mais j'ignore totalement où aller la chercher. Après de longues recherches, j'ai identifié l'objet ColorFormat (voir l'aide MSDN : Ce lien n'existe plus) mais mes connaissances actuelles en VBA m'empêchent d'aller plus loin.
Est-ce qu'une bonne âme pourrait m'aider là dessus ?
Merci d'avance !
Stakov
PS : si le résultat de mes investigations à ce sujet vous intéresse, n'hésitez pas à demander
Etant actuellement en train de programmer un utilitaire qui contient une palette de couleurs, je suis amené à explorer la notion en VBA de ThemeColorScheme qui détermine (entre autres) la palette de couleurs utilisée dans le fichier Excel. Le but final est de reproduire la palette de couleurs (voir illustration) dans un userform en respectant le thème utilisé dans le fichier.
Il se peut que ce que je m'apprête à expliquer soit basique pour nombre d'entre vous mais comme je préfère donner trop de précisions que pas assez, je me permets d'être exhaustif Ayant en effet déjà bien avancé dans cette tâche et je me permets donc de vous faire part des différentes étapes que j'ai traversées avant d'arriver au problème qui me concerne.
Tout d'abord, il faut savoir qu'une palette de couleurs contient 10 couleurs de bases (ligne du haut de la palette) qui sont ensuite la base de 50 déclinaisons (5 par couleur de base). La palette contient ensuite dans la partie du bas 10 couleurs qui ne changent jamais.
Ces 50 déclinaisons sont générées en utilisant une seule et unique propriété : TintandShade, qui est compris entre -1 et 1. Lorsqu'elle est supérieure à 0 elle éclaircit la couleur, lorsqu'elle est inférieure à 0 elle l'assombrit.
Il y a donc trois étapes à franchir pour parvenir à reconstituer la palette de couleurs :
1 - Récupérer le code des 10 couleurs de base
2 - Récupérer pour chaque déclinaison la valeur de la propriété TintandShade appliquée à la couleur de base
3 - Déterminer un algorithme permettant d'obtenir le code couleur de la déclinaison en partant uniquement du code de la couleur de base et du TintandShade de cette déclinaison.
(Si l'élément d'un userform possédait les même propriétés que les "shapes" ou qu'une cellule, j'aurais simplement pu réappliquer la valeur ThemeColorIndex et TintandShade afin de reproduire la palette, sauf que l'élément d'un userform ne possède que la propriété BackColor ...)
Je suis parvenu après de nombreux efforts et tirages de cheveux à franchir avec succès les étapes 1 et 3.
Pour l'étape 2, j'ai basé mon développement sur l'observation que j'ai faite du thème classique d'Office. J'ai procédé de manière bête et méchante en reproduisant la palette de couleur du thème dans 60 cellules, et j'ai ensuite lu pour chaque cellule la propriété .TintandShade
Voici ce que j'ai obtenu (de gauche à droite de la palette, couleurs standards exclues)
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
-0.05 | 0.5 | -0.1 | 0.8 | 0.8 | 0.8 | 0.8 | 0.8 | 0.8 | 0.8 |
-0.15 | 0.35 | -0.25 | 0.6 | 0.6 | 0.6 | 0.6 | 0.6 | 0.6 | 0.6 |
-0.25 | 0.25 | -0.5 | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 |
-0.35 | 0.15 | -0.75 | -0.25 | -0.25 | -0.25 | -0.25 | -0.25 | -0.25 | -0.25 |
-0.5 | 0.5 | -0.9 | -0.5 | -0.5 | -0.5 | -0.5 | -0.5 | -0.5 | -0.5 |
Une fois mon algorithme au point, je parviens donc, après avoir récupérer le code des 10 couleurs de bases du thème actuellement utilisé sur le fichier, à reconstruire correctement la palette de couleur en me basant uniquement sur la valeur du TintandShade des déclinaisons en suivant le plan ci-dessus, que j'enregistre dans un array.
Or ! C'est ici que le bât blesse puisque après quelques tests je me suis aperçu que ce fameux plan peut évoluer d'un thème à l'autre. Les variations semblent relativement isolées mais elles existent. Le thème "Austin" s'appuie par exemple sur le plan suivant :
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
-0.05 | 0.5 | 0.8 | 0.8 | 0.8 | 0.8 | 0.8 | 0.8 | 0.8 | 0.8 |
-0.15 | 0.35 | 0.6 | 0.6 | 0.6 | 0.6 | 0.6 | 0.6 | 0.6 | 0.6 |
-0.25 | 0.25 | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 |
-0.35 | 0.15 | -0.25 | -0.25 | -0.25 | -0.25 | -0.25 | -0.25 | -0.25 | -0.25 |
-0.5 | 0.5 | -0.5 | -0.5 | -0.5 | -0.5 | -0.5 | -0.5 | -0.5 | -0.5 |
La différence est bien minime puisque la seule la colonne 3 diffère du plan classique d'Office.
Ce que je souhaite donc faire, c'est explorer en amont du lancement de mon algorithme le ThemeColorScheme utilisé dans le fichier pour enregistrer dans un array le plan des TintandShade utilisés pour construire le reste de la palette.
C'est une donnée qui existe (comme le montre l'illustration ci-dessus avec le Tip Texte qui renvoie la valeur du TintandShade de la déclinaison en %), mais j'ignore totalement où aller la chercher. Après de longues recherches, j'ai identifié l'objet ColorFormat (voir l'aide MSDN : Ce lien n'existe plus) mais mes connaissances actuelles en VBA m'empêchent d'aller plus loin.
Est-ce qu'une bonne âme pourrait m'aider là dessus ?
Merci d'avance !
Stakov
PS : si le résultat de mes investigations à ce sujet vous intéresse, n'hésitez pas à demander
Dernière édition: