Définir les couleurs en hexadécimal Et décimal se comporter différemment

j'essaie de mettre une couleur orangée de la manière suivante:

WorkSheet.Range("A1:A5").Interior.color = 49407

et

WorkSheet.Range("A1:A5").Interior.color = &HC0FF 'Hex value of 49407

ces deux-là ne sont-ils pas censés être exactement équivalents? Les couleurs en cours de jeu sont différents.

10
demandé sur Community 2012-09-28 21:10:37

4 réponses

Non, ces valeurs ne sont pas équivalentes: &HC0FF est -16129, tandis que &HC0FF& est 49407.

VBA, étant un langage plutôt ancien utilise des entiers de 16 bits par défaut. De nos jours, vous voulez presque toujours des longs au lieu des ints, mais vous devez les demander à VBA.

&HC0FF est une construction qui définit une constante de 16 bits de hex. Parce que le bit de signe dans cette valeur est définie (négatif) s'il est interprété comme une valeur de 16 bits, donc la conversion en -16129. Nous pouvons considérer que cela craint, mais ce n'est pas un bug! Lorsque vous utilisez -16129 (comme un entier signé), sous forme de 32 bits, les 1 sont propagés à travers les 16 premiers bits et cela donne la valeur bleue de 255.

ce que vous vouliez vraiment ici est une constante hexadécimale de 32 bits:&HC0FF&. L'extra & à la fin dit à VBA qu'il s'agit d'une constante longue au lieu d'un int. Interprété en 32 bits, c'est une valeur positive, donc donne l'équivalent décimal que vous êtes à la recherche pour.

en résumé, demandez de longues constantes hexadécimales avec&.

à part, cette propension de VBA vers 16 bits peut aussi nous piquer en utilisant des constantes décimales, comme dans une expression 16000 * 16000, qui débordera l'arithmétique 16 bits. Donc, parfois on a besoin d'utiliser l'arrière & sur les constantes décimales aussi (ou en assigner une à une première longue).

32
répondu Erik Eidt 2012-10-01 01:02:42

je crois que les réponses de Gimp et Johannes tous les deux manquent la question clé.

une couleur sur un écran d'ordinateur est définie en spécifiant la quantité de rouge, bleu et vert dont vous avez besoin. Pour chacune des trois couleurs vous spécifiez un nombre entre 0 et 255. Ces trois nombres sont normalement spécifiés comme un seul nombre en concaténant les trois nombres séparés. Avec Html vous spécifiez une couleur comme # RRGGBB où RR, GG et BB sont des nombres hexadécimaux ou vous pouvez remplacer RRBBGG par équivalent décimal. Avec Excel la séquence est inversée so &HBBGGRR ou l'équivalent décimal.

49407 est l'équivalent décimal de 00C0FF qui pour Excel signifie Bleu = 0, Vert = 192 et Rouge = 255.

Mais &HC0FF ou &H00C0FF est -16129 ou Bleu = 255, Vert = 192 et Rouge = 255. Cela semble être un défaut dans la conversion de &H. Je ne trouve pas de toute façon de convertir C0FF en 49407.

si vous insistez sur l'utilisation de la conversion &H, le meilleur que je peux offrir est:

 Range("A1:A5").Interior.color = &H01C0FF

C'est bleu = 1, Vert = 192 et Rouge = 255 et je ne peux pas dire la différence de Bleu = 0, Vert = 192 et Rouge = 255.

Mais je vous recommande:

Range("A1:A5").Interior.color = RGB(255,192,0)

car la fonction RVB renvoie toujours un nombre positif et vous n'avez pas à vous soucier de la séquence inverse D'Excel.

6
répondu Tony Dallimore 2012-09-28 18:42:12

cela convertira les couleurs HEX-format que vous avez au RGB longtemps que le Bureau utilise pour les couleurs RGB:

Function HexToLongRGB(sHexVal As String) As Long
    Dim lRed As Long
    Dim lGreen As Long
    Dim lBlue As Long

    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
5
répondu Steve Rindsberg 2012-09-29 16:26:53

un Colorcode est habituellement composé de trois valeurs, rouge, verte, bleue. Votre Hexcode manque un des trois et excel le remplit automatiquement avec FF. Donc votre couleur C0FF est transformée en FFC0FF.

voici un exemple de programme pour que vous puissiez le voir en action, faire une nouvelle feuille et l'exécuter.

' C0FF will be changed to be FFC0FF
Range("A1").Interior.Color = &HC0FF
Range("A1").Select
ActiveCell.FormulaR1C1 = Range("A1").Interior.Color
Range("A2").Select
ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)"

' 49407 is actually 00C0FF
Range("B1").Interior.Color = 49407
Range("B1").Select
ActiveCell.FormulaR1C1 = Range("B1").Interior.Color
Range("B2").Select
ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)"

' Use RGB to have better control over your results
' Switch the order when doing so: 00C0FF => 00 Blue C0 Green FF Red
Range("C1").Interior.Color = RGB(&HFF, &HC0, &H0)
Range("C1").Select
ActiveCell.FormulaR1C1 = Range("C1").Interior.Color
Range("C2").Select
ActiveCell.FormulaR1C1 = "=DEC2HEX(R[-1]C,6)"

EDIT: ajout d'un troisième exemple pour illustrer la commutation des couleurs comme suggéré dans une réponse différente.

4
répondu Johannes 2012-09-28 18:03:35