Tester couleur RGB d'une cellule Excel

Signaler
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Bonjour tout le monde,
Après de longuuuuuuues recherches sur le net dans toutes les langues possibles et imaginables (ou presque), j'en viens à poser la question ici: "Est-il possible de tester la couleur RGB de remplissage d'une cellule?". Je m'y suis +/- essayé mais sans succès.

Voici donc mes codes pour plus de précision:

Public Function TestCouleur(Cellule As Range)
Application.Volatile
Couleur =  Cellule.Font.color
End Function

ou
Public Function TestCouleur(Cellule As Range)
Application.Volatile
Couleur =  Cellule.Interior.color
End Function


Appel de la fonction:
=SI(TestCouleur(G16)=ValeurDecCouleur ou CelluleAvecValeurDec;"oui";"non")



Malheureusement, à chaque fois, il m'affiche "non" même si toute la condition est juste. Voir le fichier joint pour plus d'infos...


Merci à tout ceux qui me donneront un coup de pouce là-dessus
damiens12345678

9 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut

Essaye ceci :
Couleur = Cellule.Interior.color
MsgBox Right$("000000" & Hex(Couleur), 6)
Je pense (à vérifier) que les octets affichés sous formes hexa (3 groupes de 2 caractères hexa) correspondent aux 3 couleurs RVB, mais dans l'ordre BVR.
Blanc : FF FF FF
Noir : 00 00 00
Rouge : 00 00 FF
Vert : 00 FF 00
Bleu : FF 00 00

Pour convertir de l'hexa en décimal (Long) :
ValeurDécimale = Val("&H" & CodeHexa)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
Salut,

Merci pour ta réponse. Cela dit, je ne vois pas en quoi cela pourrait changer mon problème ou modifier mon fichier. Le fait de passer de hexadécimal en décimal revient au même (par rapport ce que j'ai fait), non? Le but recherché est bien de tester la couleur d'une cellule par rapport à une valeur (également de couleur) donnée.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Bonjour,
Te fonction ne prend aucune valeur et ne retourne donc rien !
1) tu attribues une valeur à une variable Couleur alors que tu devrais l'attribuer à la fonction testcouleur
2) ta fonction devrait (et ce n'est pas le cas de la tienne) obserber la syntaxe classique :
Public function mafonction (param1 as .(type du paramètre)..) as ...(type de la fonction ....

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Et je n'ai répondu qu'en ce qui concerne l'utilisation d'une fonction, sans préjudice (autre sujet) de la "justesse" de la syntaxe que tu as mise en formule. Etrange syntaxe


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Merci pour ta réponse, ucfoutu,

Te fonction ne prend aucune valeur et ne retourne donc rien !

=> Pourtant, celle-ci fonctionne:
Public Function TestCouleur_NB(sel As Range)
Application.Volatile
Couleur = sel.Interior.ColorIndex
End Function


Exemple d'appel de celle-ci: =SI(TestCouleur_NB(G16)=10;"oui";"non") mais elle ne fonctionne qu'avec les 56 couleurs "non-RGB". C'est cela que je ne m'explique pas...
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Oui, tu as raison, je me suis lancé dans le démontage explicatif des couleurs, mais c'est ans intérêt. Pardon.

Ce que veut dire ucfoutu qui a eu l'oeil plus futé que le mien, c'est que ta fonction ne renvoie en effet rien du tout :
Pour fonctionner, elle devrait comporter :
- optionnellement mais fortement conseillé, le typage de la donnée en retour
- l'affectation du résultat à la fonction :
Public Function TestCouleur_NB(sel As Range) As Long
    Application.Volatile '                   ^^^^^^^
    ' Couleur = sel.Interior.ColorIndex
    TestCouleur_NB = sel.Interior.ColorIndex ' <-- Retour de valeur
End Function

Si tu avais rendu obligatoire la déclaration des variables en mettant "Option Explicit" en tête de chaque page de code (voir options), le compilateur t'aurait indiqué que Couleur n'est pas défini et cela t'aurais mis la puce à l'oreille.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
Merci beaucoup, j'y vois plus clair dans les retours, maintenant, malheureusement, un point reste flou, où se passe le test de la couleur (de la cellule) et du code de couleur RGB (fourni) à comparer?
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Bah en supposant que ta fonction puisse être interrogée depuis la formule d'une cellule (est-ce ta question ?), une syntaxe du genre suivant devrait fonctionner.
Tout dépend si tu respectes bien le nom de la fonction (elle a changé depuis que tu fournis des infos) et ce que tu mets dedans :
=SI(TestCouleur_NB(G16)=45;"oui";"non")
Le 45 est le .ColorIndex (pas .Color) du Orange situé en haut à droite du tableau des couleurs prédéfinies.

Ce qui m'intrigue, c'est le "(G16)"
Pour moi, ceci ne définit pas un Range. Alors est-ce accepté par le paramètre de ta fonction ?
Il n'y a que toi qui peut le dire en faisant des essais et en surveillant les messages d'erreur.
PS : Supprime tous les "On Error Resume Next" qui pourraient agrémenter ton code. On peut programmer sans cette instruction qui cache les problèmes et rend le diagnostique impossible.

Au pire, transforme le paramètre en String + fournis-lui "G16" avec les guillements et transforme ta fonction :
Public Function TestCouleur_NB(sel As String) As Long
    Application.Volatile
    Dim oRange As Range
    Set oRange = Range(sel)
    TestCouleur_NB = oRange.Interior.ColorIndex
End Function

PS : Ce "Volatile", il sert à quoi ?
Est-il vraiment utile ?
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Alors, tu t'en sors ?