Explorer le thème Office & propriété TintAndShade

Stakov

XLDnaute Nouveau
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.

PaletteOffice.png

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)
0000000000
-0.050.5-0.10.80.80.80.80.80.80.8
-0.150.35-0.250.60.60.60.60.60.60.6
-0.250.25-0.50.40.40.40.40.40.40.4
-0.350.15-0.75-0.25-0.25-0.25-0.25-0.25-0.25-0.25
-0.50.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 :

0000000000
-0.050.50.80.80.80.80.80.80.80.8
-0.150.350.60.60.60.60.60.60.60.6
-0.250.250.40.40.40.40.40.40.40.4
-0.350.15-0.25-0.25-0.25-0.25-0.25-0.25-0.25-0.25
-0.50.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.
PaletteOffice2.png
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 ? :confused:

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:

Dranreb

XLDnaute Barbatruc
Re : Explorer le thème Office & propriété TintAndShade (via objet ColorFormat?)

Bonsoir.
Puis je savoir la finalité de la chose ? Je n'ai pas cette version d'Excel, mais si la finalité était par exemple de pouvoir reproduire les couleurs du "thème" dans les BackColor des userfom et de leurs contrôles pour être homogène avec la présentation des feuilles, j'aurais peut être un petit outil écrit en VB6 qui pourrait vous intéresser.
Il peut entre autre capturer la couleur d'un pixel n'importe où sur l'écran (dans n'importe quelle application visible donc)
Mais il permet aussi de l'analyser, et de la "décliner" à toutes les luminosités et saturations (où 3 autres paramètres possibles: Force, Pureté ou Quotient bleu), de trouver la luminosité où elle est la plus saturée etc.
À +
 

Modeste geedee

XLDnaute Barbatruc
Re : Explorer le thème Office & propriété TintAndShade (via objet ColorFormat?)

Bonsour®

quelques pistes d'investigations :
The Spreadsheet Page Blog: Excel 2007 VBA Challenge
The Spreadsheet Page Blog: Exploring Theme Colors

noter le commentaire de john :
write a VBA macro that makes the active cell exactly the same color as a shape (and keep the color "theme-able." I dug a little deeper, and now I'm 90% convinced that the task is not possible.
 

Stakov

XLDnaute Nouveau
Re : Explorer le thème Office & propriété TintAndShade

Bonsoir Dranreb, Modeste geedee,

Merci pour votre retour !

Dranreb, l'utilitaire que je programme actuellement me servira à faire un chercher/remplacer sur les couleurs des cellules d'une sélection.

Par exemple, je sélectionne 10 cellules, dans ces 10 cellules j'ai 3 cellules en rouge, 2 en jaune, 3 en vert et le reste sans couleur (essayons de rester indulgent avec le goût esthétique de l'auteur de ce fichier ^^).
Mon utilitaire me permet de lister (sans doublons) dans un userform les couleurs utilisées dans la sélection (donc 4 couleurs : pas de couleur, rouge, jaune et vert) et de les remplacer par une autre couleur.

C'est pour sélectionner la couleur qui va remplacer une couleur existante dans la sélection que je développe ma palette de couleurs.

Cependant je récupèrerai très probablement le code pour l'adapter à d'autres utilisations, donc je suis effectivement preneur de votre outil :)

Modeste geedee, merci pour les liens. Ayant écumé Google à la recherche de renseignements je suis également tombé sur ces deux pages. Cependant je ne serai pas trop exigent et ne cherche pas à avoir des couleurs correspondantes à 100%, l'intérêt étant d'avoir une palette qui ressemble à celle du thème utilisé.


Je viens pour ma part de terminer des investigations et autres tests, et je crois bien que j'ai trouvé une réponse ! :cool:

Ce document m'a mis sur la voie : Documents, Presentations, and Workbooks: Using Microsoft® Office to Create ... - Stephanie Krieger - Google Livres

L'auteur y parle de "couleur très claire", "couleur très foncée" et de "couleur intermédiaire". De là j'ai compris qu'en réalité Office n'intégrait pas des "plans" de TintandShade, ce qui est évident puisque quand on créé un Thème personnalisé la palette se génère automatiquement après avoir sélectionné les couleurs de base.

En réalité, Office intègre des plans prédéfinis de TintandShade : pour le blanc, pour le noir, pour les couleurs très claires, pour les couleurs très foncées et pour les couleurs intermédiaires. Les voici :
BlancNoirClairIntermédiaireFoncé
-0.050.5-0.10.80.9
-0.150.35-0.250.60.75
-0.250.25-0.50.40.5
-0.350.15-0.75-0.250.25
-0.50.05-0.9-0.50.1

Ensuite, il a fallu trouver quel critère Office utilise pour déterminer qu'une couleur est claire, intermédiaire ou foncée. Après de plusieurs tests, j'ai trouvé que le critère utilisé est logiquement la Luminosité (mode TSL) avec la règle suivante :
- L > 203 : couleur claire
- L < 51 : couleur foncée
- 52 <= L <= 203 : couleur intermédiaire
Si elles peuvent sembler arbitraire, ces valeurs n'ont pas été choisies au hasard puisque 52/255 = 0.2 et 203/255 = 0.8. Donc entre une luminosité de 20% à 80% la couleur est intermédiaire.

Donc avant d'activer mon algorithme, je déterminerai pour chaque couleur de base quelle est sa luminosité pour déterminer le plan de TintandShade que je dois appliquer.

Problème résolu !

Ce sujet peut sembler inintéressant, ou plutôt pointilleux. Cependant si cela intéresse quelqu'un, qu'il n'hésite pas à me demander je pourrai rédiger un post d'explication.

PS : rien à voir avec l'object ColorFormat du coup !
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Re : Explorer le thème Office & propriété TintAndShade

Bonsour®
- trouver quel critère Office utilise pour déterminer qu'une couleur est claire, intermédiaire ou foncée. Après de plusieurs tests, j'ai trouvé que le critère utilisé est logiquement la Luminosité (mode TSL) avec la règle suivante :
- L > 203 : couleur claire
- L < 51 : couleur foncée
- 52 <= L <= 203 : couleur intermédiaire
Si elles peuvent sembler arbitraire, ces valeurs n'ont pas été choisies au hasard puisque 52/255 = 0.2 et 203/255 = 0.8. Donc entre une luminosité de 20% à 80% la couleur est intermédiaire.

Microsoft utilise et met a disposition de VBA l'acces aux APIs RGBCapture.JPG

Microsoft utilise mais ne met pas à disposition l'accés aus APIs HSL ...Capture2.JPG

les algorithmes de conversion sont à adapter depuis :

EasyRGB - The inimitable RGB and COLOR search engine!
 

Pièces jointes

  • Capture.JPG
    Capture.JPG
    30.5 KB · Affichages: 152
  • Capture.JPG
    Capture.JPG
    30.5 KB · Affichages: 176
  • Capture2.JPG
    Capture2.JPG
    29.8 KB · Affichages: 149
  • Capture2.JPG
    Capture2.JPG
    29.8 KB · Affichages: 125

Dranreb

XLDnaute Barbatruc
Re : Explorer le thème Office & propriété TintAndShade

Bonjour.
Mon utilitaire.
Les luminosité y sont considérées en "énergies" linéaires allant de 0 à 1000. la valeur 1000 correspond à 255 mais la valeur 500 ne correspond pas à 127 ou 128 à cause du gamma des écrans. C'est 186 et c'est la luminosité d'une mosaïque de motifs blancs et noir occupant chacun 50% de la surface.
Cordialement.
 

Pièces jointes

  • Couleurs.zip
    52.6 KB · Affichages: 70
  • Couleurs.zip
    52.6 KB · Affichages: 70
  • Couleurs.zip
    52.6 KB · Affichages: 79

Discussions similaires

Statistiques des forums

Discussions
312 156
Messages
2 085 819
Membres
102 991
dernier inscrit
justingr