Microsoft 365 Fonction perso ref couleur Hexa en couleur de fond de cellule

treza88

XLDnaute Occasionnel
Bonjour à tous ,

Je cherche à mettre le fond de cellules en couleur avec la référence en hexadécimale de la couleur, grâce a une fonction personnalisé et une fonction qui transforme l'Hexa en RGB

si je passe par une procédure tout fonctionne, mais si je passe par une fonction personnalisé j'ai un "#Valeur" en "D3" qui s'affiche.

Pouvez vous me dire pourquoi ?

Voici le fichier :
 

Pièces jointes

  • Classeur1.xlsm
    48.1 KB · Affichages: 8

Dranreb

XLDnaute Barbatruc
Bonjour.
Attention, quand une couleur est indiquée en Hexadécimal précédé d'un "#" ce sont en général les valeurs hexadécimales du rouge, vert et bleu dans cet ordre qui sont indiquées. Tandis que la fonction RGB de VBA, qui renseigne pourtant correctement les propriétés Color d'Excel, produit un Long où, dans sa valeur hexadécimale, les octets du rouge et du bleu sont intervertis.
Si vous tenez à une fonction, elle ne peut pas changer la couleur de fond de la cellule qui la porte, mais elle peut laisser une consigne à exécuter par une Workbook_SheetCalculate.
En attendant cette fonction assez simple devrait vous calculer votre valeur de Color :
VB:
Function VColorHex(ByVal Txt As String) As Long
   If Left$(Txt, 1) = "#" Then Txt = Mid$(Txt, 6, 2) & Mid$(Txt, 4, 2) & Mid$(Txt, 2, 2)
   If Left$(Txt, 2) <> "&H" Then Txt = "&H" & Txt
   VColorHex = Val(Txt & "&")
   End Function
 

treza88

XLDnaute Occasionnel
Merci vgendron, mais ...
Pas possible, peut etre.
De plus je ne suis pas sur que le contexte soit le même.
Par contre j'aimerais comprendre pourquoi il y a un "#valeur" ?
Sans comprendre le pourquoi, on ne peut pas résoudre ou comprendre le problème.

Donc si quelqu'un peut m'expliquer ce "#Valeur" dans le contexte de ma fonction, merci d'avance.
 

treza88

XLDnaute Occasionnel
Merci pour ton intervention Dranreb,
La fonction pour transformer les Hexa en RGB est dans le fichier c'est la fonction hexaColor().
et elle fonctionne parfaitement.
Je peux définir que la couleur soit changer dans une autre cellule que celle de la fonction.
C'est d’ailleurs déjà le cas, ma fonction est en "D3" et je change la couleur de "A2" :

VB:
Function azer(ByVal rng As Range)

Application.Volatile True

Range("A2").Interior.Color = hexaColor(rng.Text)

End Function

Mon etonnement est sur le "#Valeur".

Et peut tu pévelopper le :

Code:
Workbook_SheetCalculate
 

Dranreb

XLDnaute Barbatruc
Et peut tu pévelopper le :

Code:
Workbook_SheetCalculate
Dans les fonction ajouter ThisWorkbook.Consigne Application.Caller.EntireRow.Columns(1), VColor :
VB:
Function VColorHex(ByVal Txt As String) As Long
   If Left$(Txt, 1) = "#" Then Txt = Mid$(Txt, 6, 2) & Mid$(Txt, 4, 2) & Mid$(Txt, 2, 2)
   If Left$(Txt, 2) <> "&H" Then Txt = "&H" & Txt
   VColorHex = Val(Txt & "&")
   ThisWorkbook.Consigne Application.Caller.EntireRow.Columns(1), VColorHex
   End Function
Function VColorRGB(ByVal Txt As String) As Long
   Dim TSpl() As String
   TSpl = Split(Txt, "-")
   VColorRGB = RGB(TSpl(0), TSpl(1), TSpl(2))
   ThisWorkbook.Consigne Application.Caller.EntireRow.Columns(1), VColorRGB
   End Function
Dans le module ThisWorkbook :
VB:
Option Explicit
Private Cln As New Collection
Public Sub Consigne(ByVal Rng As Range, VColor As Long)
   Cln.Add Array(Rng, VColor)
   End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
   Dim Arr()
   Do While Cln.Count > 1
      Arr = Cln(1): Cln.Remove 1
      Arr(0).Interior.Color = Arr(1)
      Loop
   End Sub
 

treza88

XLDnaute Occasionnel
Merci Dranreb pour ce code avec Workbook_SheetCalculate.

Mais je ne te cache pas que j'ai un peu de mal à analyser son fonctionnement.
J'ai essayé de le tester, sans arriver à le faire fonctionner.

Tu aurais quelques explications sur son fonctionnement ?
 

Dranreb

XLDnaute Barbatruc
Qu'est ce que vous voulez savoir ?
La méthode Consigne du module ThisWorkbook note dans sa collection privée une demande de changer une couleur de fond d'une plage, manœuvre interdite pendant l'évaluation d'une formule, et après les calculs cette collection est parcourue, interprétée et vidée par sa Private Sub Workbook_SheetCalculate.
Mais je vois que certains code de la colonne A étaint devenus illisibles. Alors j'ai installé mon module de classe Couleur parce qu'il sait calculer une couleur de police adéquate.
Je me suis aussi amusé à produire une description de la couleur …
 

Pièces jointes

  • CouleurClsTreza88.xlsm
    95.6 KB · Affichages: 6
Dernière édition:

treza88

XLDnaute Occasionnel
Whaouuuh, il y a un bouleau de fou, et tu as fait ça en très peu de temps.

Chapeau bas, tu maitrise le sujet, pour moi c'est impressionnant de voir un tel travail.

Mais je ne comprend pas comment :

VB:
Public Sub Consigne(ByVal Rng As Range, VColor As Long)

Récupère les paramètres "Rng" et "VColor" ?
 

Dranreb

XLDnaute Barbatruc
Il les loge dans un Array(Rng, VColor) qu'il envoie dans la collection. Je ne suis pas sûr d'avoir compris la question …
Ils lui sont transmis par les fonctions qui invoquent cette méthode : ThisWorkbook.Consigne Application.Caller.EntireRow.Columns(1), VColorRGB
 

Dudu2

XLDnaute Barbatruc
Bonsoir les coloristes,
Pour colorer une cellule ou un Range dans une fonction personnalisée il faut passer par un mécanisme complexe que connaît @Dranreb (dont je me suis inspiré pour la Collection) et que j'ai mis en œuvre d'une manière spécifique et autonome dans cette ressource dans les Fonctions Personnalisées de XLD. Directement c'est strictement impossible SAUF pour la couleur de fonte bizarrement.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
313 865
Messages
2 103 078
Membres
108 521
dernier inscrit
manouba