web-dev-qa-db-fra.com

Renvoie les valeurs RVB de Range.Interior.Color (ou de toute autre propriété de couleur).

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).

15
CodeJockey

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!

Détermination de la valeur RVB d'une couleur

12
CodeJockey

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
38
Mark Balhoff

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

12
Harry S

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.

2
kraft hannes

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
0
Johnny MMXVII

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
0
dumpguy