IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

Utiliser les codes couleur Hex type #000000 dans le VBA


Sujet :

IHM

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut Utiliser les codes couleur Hex type #000000 dans le VBA
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.CtrlAColorer.BackColor = &HFB7D8F
    2ème option on insère le code couleur sans le # avec un peu de code VBA :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sHexVal = Replace(sHexVal, "#", "") 'Modif. pour travailler avec les codes entiers (incluant #)
    Pour pouvoir faire des copier/coller à la volée.

    Merci.

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 015
    Points : 24 552
    Points
    24 552
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.

    Effectivement, mon premier message pourrait trouver sa place à la suite de la discussion que vous indiquez.

    En même temps, le début de la discussion ressemble plus à un projet particulier, alors que j'ai le sentiment que la solution que je rapporte ci-avant est un peu plus universelle.

    Encore merci.

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 015
    Points : 24 552
    Points
    24 552
    Par défaut
    Il faut consulter le dernier message. C'est là qu'on trouve la solution en 1 ligne.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour.
    Citation Envoyé par loufab Voir le message
    Il faut consulter le dernier message. C'est là qu'on trouve la solution en 1 ligne.
    Si j'ai bien compris, on parle de cela :
    Citation Envoyé par User Voir le message
    [...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CodeNumerique = CLng("&h" & Mid(CodeAlphanumerique, 2))
    [...]
    Si c'est effectivement le code auquel vous faites référence, je suppose qu'on l'utilise comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim CodeAlphanumerique As String
    CodeAlphanumerique = "FB7D8F"
    Me.CtrlAColorer.BackColor = CLng("&h" & Mid(CodeAlphanumerique, 2))
    Si j'ai bon jusque là, à mon tour, je vous invite à prendre connaissance de ceci, déjà évoqué un peu plus haut :
    Citation Envoyé par Access_ible Voir le message
    [...]
    Dans un certain nombre de cas, c’est-à-dire pour certaines couleurs, ça fonctionne.
    [...]
    il est rare de trouver l'indication que cela ne fonctionne pas systématiquement.
    [...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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…
    [...]
    J'ai bien noté que le dernier code que vous proposez n'est pas le même, mais le résultat est tout autant non systématiquement pertinent.

    Avec le dernier code que vous proposez (si j'ai bien saisi celui dont il était question et son usage), certaines des couleurs ci-avant produisent le résultat attendu, d'autres non...

    Une conversion en RGB produit toujours le résultat escompté.

    Mais je suis toujours à l'écoute de solutions encore plus simples.

    Encore merci.

  6. #6
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 338
    Points : 19 573
    Points
    19 573
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Le code avec Clng ou val n'est pas de Loufab que je salue au passage.

    Voici comment je comprends les choses :

    Le code affiché dans la feuille des propriété est différent par rapport au code utilisé avec la fonction Clng(codeAlpha) ou val(codeAlpha), comme mentionné le hex doit être inversé : normalement les 2 premiers caractères représentent la composante rouge, ceux du milieu le vert, et les 2 derniers le bleu.

    Le bleu devrait donner #0000FF (R=0, G=0, B=255) , mais pour le passer à la fonction Clng le code être : &H00FF0000 ou avec val : &H00FF0000&

    • & = Caractère de début
    • H = indique un code Hex.
    • 00 = indique d'utiliser une couleur personnalisée
    • FF0000 = le code Hex avec le RGB inversé
    • & = Caractère de fin


    Exemple avec la fonction clng ou val :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CLng("&H" + Mid("#00FF0000", 2))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    val("&H" + Mid("#00FF0000&", 2))
    qui est équivalent avec ta fonction prise sur le net à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HexToLongRGB("#0000FF")
    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

Discussions similaires

  1. Utiliser les champs vides d'une table dans un code
    Par marcelstan dans le forum Access
    Réponses: 1
    Dernier message: 23/03/2015, 12h34
  2. Réponses: 28
    Dernier message: 09/01/2007, 16h30
  3. Réponses: 6
    Dernier message: 07/04/2006, 01h10
  4. [C#][couleur]Utilisation des codes couleurs?
    Par bakonu dans le forum C#
    Réponses: 3
    Dernier message: 28/11/2005, 19h38
  5. utilisation de "LIKE" avec un type datetime dans r
    Par ericmart dans le forum Langage SQL
    Réponses: 8
    Dernier message: 06/11/2003, 14h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo