Bonjour.
Si, comme moi, vous voulez à tous prix utiliser les codes couleur Hex type #FFFFFF dans le VBA...
Il m'a fallu consulter de nombreux forums et tutos pour tomber sur cette solution.
Je n'ai pas réussi à la trouver ici.
Je me permets donc de la partager avec la communauté.
Si je ne l'ai pas cherchée suffisamment ici et qu'elle s'y trouve déjà, je compte sur un modérateur pour vaporiser le présent message. Merci.
En bref :
Comment réutiliser en VBA les codes couleurs indiqués par Access dans les propriétés des formulaires et états, codes commençant par # et comportant, en tout, 7 caractères.
Solution :
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Public Function HexToLongRGB(sHexVal As String) As Long
'Pour convertir un code couleur Access type #FFFFFF en données utilisables en VBA et dont le résulat est la couleur correspondante au nuancier Access
'Permet de faire des Copier/Coller des valeurs indiquées par Access dans les propriétés du formulaire.
'Merci Steve Rindsberg
'https://stackoverflow.com/questions/12644456/setting-colors-in-hex-and-decimal-behaving-differently
Dim lRed As Long
Dim lGreen As Long
Dim lBlue As Long
sHexVal = Replace(sHexVal, "#", "") 'Modif. pour travailler avec les codes entiers (incluant #)
lRed = CLng("&H" & Left$(sHexVal, 2))
lGreen = CLng("&H" & Mid$(sHexVal, 3, 2))
lBlue = CLng("&H" & Right$(sHexVal, 2))
HexToLongRGB = RGB(lRed, lGreen, lBlue)
End Function |
Utilisation (Exemple):
Pour changer la couleur de fond d'un control :
Me.CtrlAColorer.BackColor = HexToLongRGB("#FB7D8F")
Le résultat est ici un genre de rouge, le même rouge sélectionné dans la palette de couleurs Access et qui porte le code #FB7D8F dans la feuille de propriété du contrôle nommé "CtrlAColorer".
Explications :
Ce code couleur, ici précédé de # est généralement présenté comme Hex.
Face à la demande de pouvoir l'utiliser dans le VBA, les réponses peuvent être classées en deux groupes.
Un premier groupe qui propose de convertir ce code en autre chose, comme par exemple une correspondance en valeur RGB, soit Red, Green, Blue, avec des valeurs allant de 0 à 255.
Ce peut être fait en utilisant un site dédié aux couleurs, soit en utilisant un autre logiciel capable de faire la "traduction", soit en se constituant un utilitaire, notamment en prenant exemple sur celui disponible sur votre forum préféré.
Ensuite on utilise les valeurs converties pour les indiquer dans le code.
Dans notre exemple :
Me.CtrlAColorer.BackColor = RGB(251, 125, 143)
Couramment, j'ai recours à l'espace colorimétrique RGB, notamment pour récupérer la couleur de fond d'un logo par exemple.
Je ne trouve rien de particulier à redire à cette méthode, sauf que si l'on utilise à la fois les feuilles de propriétés des formulaires et états et que l'on souhaite réutiliser une couleur, dans le VBA, ça fait toujours un peu plus de gymnastique de passer par RGB que de faire un Copier/Coller du code Hex.
Le second groupe de réponses propose d'utiliser directement le code couleur dans le VBA, en faisant une simple modif, à savoir enlever le #, et en ajoutant quelques lettres de code :
1ère option, on remplace le # par &H :
Me.CtrlAColorer.BackColor = &HFB7D8F
2ème option on insère le code couleur sans le # avec un peu de code VBA :
Me.CtrlAColorer.BackColor = Val("&H" & "FB7D8F")
Dans un certain nombre de cas, c’est-à-dire pour certaines couleurs, ça fonctionne.
Mais parmi ce second groupe de réponses, il est rare de trouver l'indication que cela ne fonctionne pas systématiquement.
Il m'a fallu encore plus de lecture pour découvrir que cela ne fonctionnait pas systématiquement et pas que chez moi.
Voilà ma source, qui commence par proposer une conversion en RGB :
'https://www.youtube.com/watch?v=9e8AlVYv2UM
Ensuite il démontre pourquoi il n'utilise pas les codes Hex :
https://youtu.be/9e8AlVYv2UM?t=603
Vous pouvez vous précipiter et vérifier les deux exemples ci-dessus.
Avec le même code couleur que depuis le début de ce message, ils ne donnent pas un genre de rouge, mais… un genre de violet (et ce n'est pas un problème lié à cette couleur en particulier).
1 2 3 4 5 6 7 8
| Me.CtrlAColorer.BackColor = &HFFFFFF
'Donne effectivement le blanc correspondant
Me.CtrlAColorer.BackColor = &H0000FF
'Donne du rouge au lieu du bleu
Me.CtrlAColorer.BackColor = &H00FF00
'Donne du noir au lieu du vert
Me.CtrlAColorer.BackColor = &HFB7D8F
'Donne un genre de violet au lieu d'un genre de rouge
|
Certains proposent d'inscrire des variantes plus ou moins compressées du code proposé en début de ce message, directement après .BackColor =.
Je trouve personnellement plus légère l'unique fonction pour tout le projet, qu'on appelle juste après .BackColor = HexToLongRGB().
Je ne l'ai pas créé moi-même, je l'ai juste trouvé à l'endroit indiqué.
Je me suis permis d'ajouter :
sHexVal = Replace(sHexVal, "#", "") 'Modif. pour travailler avec les codes entiers (incluant #)
Pour pouvoir faire des copier/coller à la volée.
Merci.
Partager