J'essayais de modifier progressivement la couleur d'arrière-plan d'une cellule en noir et j'ai constaté que la méthode Range.Interior.Color renvoie un élément Long qui semble arbitraire. En regardant la documentation sur MSDN, il n'y a presque rien sur ce que ce nombre représente. Existe-t-il un moyen de renvoyer la valeur RVB de cette longueur? J'ai effectivement besoin de l'opposé de la fonction RVB (rouge, vert, bleu).
Réponse courte:
Il n'y a pas de fonctionnalité intégrée pour cela. Vous devez écrire votre propre fonction.
Longue réponse:
Le long qui est renvoyé par la propriété Interior.Color est une conversion décimale des nombres hexidécimaux typiques que nous sommes habitués à voir pour les couleurs en HTML, par exemple. "66FF66". En outre, la constante xlNone (-4142) peut être transmise à une cellule définie pour ne pas avoir de couleur en arrière-plan. Toutefois, ces cellules sont marquées en blanc RGB(255, 255, 255)
dans la propriété Get
. Sachant cela, nous pouvons écrire une fonction qui renvoie une ou toutes les valeurs RVB appropriées.
Heureusement, un type, M. Allan Wyatt, l’a fait justement ici!
Ce nombre "arbitraire" est une combinaison mathématique des valeurs RVB (B * 256 ^ 2 + G * 256 + R) et une conversion de la valeur de couleur hexadécimale en un nombre décimal (base 16 à base 10), selon le sens vous voulez le regarder. Juste des bases différentes. Ci-dessous, la méthode que j'utilise dans le fichier de complément XLAM que j'ai écrit pour Excel. Cette méthode a été utile plusieurs fois. J'ai inclus la documentation dans mon fichier addin.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Function Color
' Purpose Determine the Background Color Of a Cell
' @Param rng Range to Determine Background Color of
' @Param formatType Default Value = 0
' 0 Integer
' 1 Hex
' 2 RGB
' 3 Excel Color Index
' Usage Color(A1) --> 9507341
' Color(A1, 0) --> 9507341
' Color(A1, 1) --> 91120D
' Color(A1, 2) --> 13, 18, 145
' Color(A1, 3) --> 6
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function Color(rng As Range, Optional formatType As Integer = 0) As Variant
Dim colorVal As Variant
colorVal = Cells(rng.Row, rng.Column).Interior.Color
Select Case formatType
Case 1
Color = Hex(colorVal)
Case 2
Color = (colorVal Mod 256) & ", " & ((colorVal \ 256) Mod 256) & ", " & (colorVal \ 65536)
Case 3
Color = Cells(rng.Row, rng.Column).Interior.ColorIndex
Case Else
Color = colorVal
End Select
End Function
bon de voir que M. Wyatt utilise la méthode rapide de couleur RVB
R = C Mod 256
G = C \ 256 Mod 256
B = C \ 65536 Mod 256
qui est beaucoup plus rapide que ceux qui utilisent hex str avec gauche milieu droit .__ que certains recommandent
L'autre réponse n'a pas fonctionné pour moi. Je l'ai trouvé:
R = C And 255
G = C \ 256 And 255
B = C \ 256 ^ 2 And 255
et cela a fonctionné correctement.
Notez que pour les valeurs hexadécimales, si vous exportez du HTML, vous aurez aussi des problèmes.
Idéalement, vous créez la chaîne hexagonale à partir des couleurs individuelles plutôt que de renvoyer un hexagone à partir du nombre ColorVal.
La raison en est que vous pouvez obtenir des nombres hexadécimaux invalides si la cellule est de couleur «pure» comme le vert/bleu.
ROUGE - RVB (255,0,0) renvoie 'FF' - il devrait renvoyer 'FF0000'
BLEU - RVB (0,0255) renvoie 'FF00000' - il devrait renvoyer '0000FF'
entrez la description de l'image ici
Si vous les utilisiez pour créer une sortie couleur HTML/CSS, vous obtiendriez le ROUGE pour toutes les cellules bleues.
J'ai modifié le script pour assembler chaque "bloc" hexagonal de deux caractères en fonction des valeurs RVB, avec un fichier UDF qui est simplement complété par un zéro (0) où la sortie d'un caractère est renvoyée (si vous lisez ceci, vous pouvez créer quelque chose de similaire). )
Color = ZeroPad(Hex((colorVal Mod 256)), 2) & ZeroPad(Hex(((colorVal \ 256) Mod 256)), 2) & ZeroPad(Hex((colorVal \ 65536)), 2)
--Edit: oublié d'inclure le code de l'UDF ...
Function ZeroPad(text As String, Cnt As Integer) As String
'Text is the string to pad
'Cnt is the length to pad to, for example ZeroPad(12,3) would return a string '012' , Zeropad(12,8) would return '00000012' etc..
Dim StrLen As Integer, StrtString As String, Padded As String, LP As Integer
StrLen = Len(Trim(text))
If StrLen < Cnt Then
For LP = 1 To Cnt - StrLen
Padded = Padded & "0"
Next LP
End If
ZeroPad = Padded & Trim(text)
ENDOF:
End Function
Le script VBA de Mark Balhoff fonctionne bien. Tous les crédits vont à lui.
Si vous souhaitez également obtenir les codes de couleur/index des cellules au format conditionnel, le code peut être modifié comme suit:
'----------------------------------------------------------------
' Function Color
' Purpose Determine the Background Color Of a Cell
' @Param rng Range to Determine Background Color of
' @Param formatType Default Value = 0
' 0 Integer color of cell, not considering conditional formatting color
' 1 Hex color of cell, not considering conditional formatting color
' 2 RGB color of cell, not considering conditional formatting color
' 3 Excel Color Index color of cell, not considering conditional formatting color
' 4 Integer "real" visible color of cell (as the case may be the conditional formatting color)
' 5 Hex "real" visible color of cell (as the case may be the conditional formatting color)
' 6 RGB "real" visible color of cell (as the case may be the conditional formatting color)
' 7 Excel Color Index "real" visible color of cell (as the case may be the conditional formatting color)
' Usage Color(A1) --> 9507341
' Color(A1, 0) --> 9507341
' Color(A1, 1) --> 91120D
' Color(A1, 2) --> 13, 18, 145
' Color(A1, 3) --> 6
'-----------------------------------------------------------------
Function Color(rng As Range, Optional formatType As Integer = 0) As Variant
Dim colorVal As Variant
Select Case formatType
Case 0 To 3
colorVal = Cells(rng.Row, rng.Column).Interior.Color
Case 4 To 7
colorVal = Cells(rng.Row, rng.Column).DisplayFormat.Interior.Color
End Select
Select Case formatType
Case 0
Color = colorVal
Case 1
Color = Hex(colorVal)
Case 2
Color = (colorVal Mod 256) & ", " & ((colorVal \ 256) Mod 256) & ", " & (colorVal \ 65536)
Case 3
Color = Cells(rng.Row, rng.Column).Interior.ColorIndex
Case 4
Color = colorVal
Case 5
Color = Hex(colorVal)
Case 6
Color = (colorVal Mod 256) & ", " & ((colorVal \ 256) Mod 256) & ", " & (colorVal \ 65536)
Case 7
Color = Cells(rng.Row, rng.Column).DisplayFormat.Interior.ColorIndex
End Select
End Function