En bref — La
.Colord'une cellule n'est pas un nom de couleur ; c'est un nombre unique.RGB(r, g, b)est la fonction qui empile trois canaux (chacun de 0 à 255) dans ce nombre. Le piège tient à l'ordre :RGBle construit en rouge en bas, bleu en haut (r + g*256 + b*65536), soit l'inverse d'un code hexadécimal web. Coller#4472C4tel quel dans.Color = &H4472C4intervertit donc le rouge et le bleu et vous donne la mauvaise couleur. Construisez toujours vos couleurs avecRGB(...), et si vous devez employer de l'hexadécimal, souvenez-vous que les octets sont à l'envers.
' RGB empile trois canaux dans un seul Long :
Range("A1").Interior.Color = RGB(68, 114, 196) ' un bleu precis, correct sur toute machine
' L'hexa web #4472C4 est le MEME bleu - mais ne le collez PAS brut :
Range("A2").Interior.Color = &H4472C4 ' FAUX : ceci donne #C47244 (rouge et bleu intervertis)
Range("A3").Interior.Color = RGB(&H44, &H72, &HC4) ' JUSTE : eclatez l'hexa en canaux
Chaque propriété de couleur en VBA Excel — remplissage de cellule (Interior),
Font, Borders, couleur d'onglet, série de graphique —
prend le même genre de valeur : un nombre 24 bits. RGB est la façon de le construire, et comprendre
ce que ce nombre est éclaire toute une famille de bugs « la couleur est proche mais fausse », surtout
quand un code hexadécimal issu d'un site ou d'une charte de marque entre en jeu.
Ce que vous allez apprendre
- Le modèle mental —
.Colorest un seul nombre, etRGBest l'empileur - Le piège qui attrape tout le monde — le nombre est stocké en
BGR, inversé par rapport à l'hexa web - Les constantes de couleur
vb*, et ce qu'elles révèlent sur l'ordre des octets - Relire une couleur et l'éclater en rouge, vert, bleu
- Pourquoi le modèle de couleur est identique pour les remplissages, polices, bordures et graphiques
- Le jugement — définissez votre palette une seule fois en constantes nommées
Le modèle mental : un nombre, trois canaux
Une couleur à l'écran, ce sont trois molettes : combien de rouge, combien de vert, combien de bleu,
chacune de 0 à 255. RGB(r, g, b) prend ces trois molettes et les replie en un seul entier (un Long)
qu'Excel stocke sur l'objet. RGB(0,0,0) est noir (toutes molettes à zéro), RGB(255,255,255) est
blanc (toutes à fond), RGB(255,0,0) est rouge pur. La couleur n'a rien de mystérieux — la surprise
tient entièrement à la façon dont les trois molettes sont empilées dans un seul nombre, et c'est là
que se loge le bug.
La règle qui compte le plus : le nombre est BGR, pas RGB
Voici la formule que RGB emploie réellement :
RGB(r, g, b) = r + g * 256 + b * 65536
Lisez-la attentivement : le rouge est l'octet le plus bas, le bleu le plus haut. En hexadécimal, la
valeur stockée est &HBBGGRR, pas &HRRGGBB. Une couleur web comme #4472C4 signifie rouge 44,
vert 72, bleu C4 en ordre RGB — mais Excel la stocke en ordre BGR. Ainsi, dès l'instant où vous
collez un hexa web tel quel dans .Color, vous avez interverti les canaux rouge et bleu :
Range("A1").Interior.Color = &H4472C4 ' Excel lit ceci en BGR : R=C4, G=72, B=44 -> un rouge orange
Ce n'est pas une erreur d'arrondi ; c'est une couleur complètement différente, et c'est la raison
numéro un pour laquelle une couleur de marque « paraît fausse dans la macro » alors qu'elle allait bien
en CSS. Le remède fiable est de ne jamais tendre à Excel un hexa empilé — tendez-lui les trois canaux
et laissez RGB les empiler :
Range("A1").Interior.Color = RGB(&H44, &H72, &HC4) ' correct : les canaux restent dans les bonnes molettes
Si vous devez vraiment stocker un littéral, inversez-le en &HC47244. Mais éclater l'hexa en RGB(...)
est plus clair et impossible à mettre à l'envers, c'est donc l'habitude à prendre.
Les constantes vb, et ce qu'elles prouvent
VBA fournit une poignée de constantes de couleur nommées. Elles sont commodes pour les primaires, et confirment discrètement l'ordre des octets :
Debug.Print vbRed ' 255 = RGB(255, 0, 0) -> le rouge est l'octet bas
Debug.Print vbGreen ' 65280 = RGB(0, 255, 0)
Debug.Print vbBlue ' 16711680 = RGB(0, 0, 255) -> le bleu est l'octet haut
vbRed = 255 est l'indice révélateur : si le rouge était l'octet haut, le rouge pur vaudrait
16711680. Seules huit de ces constantes existent (vbBlack, vbWhite, vbRed, vbGreen, vbBlue,
vbYellow, vbMagenta, vbCyan), elles conviennent donc pour une primaire rapide mais ne remplacent
pas une vraie palette. Pour tout ce qui relève d'une marque, écrivez-la avec RGB(...).
Relire une couleur et l'éclater
Relire .Color vous donne le Long empilé. Pour en extraire les trois canaux, inversez l'empilage —
le rouge est le reste, le bleu le sommet :
Dim c As Long: c = Range("A1").Interior.Color
Dim r As Long, g As Long, b As Long
r = c Mod 256
g = (c \ 256) Mod 256
b = c \ 65536
Debug.Print r, g, b ' les trois canaux d'origine
L'enseignement pratique pour les comparaisons : ne comparez jamais une .Color stockée à un littéral
hexa que vous avez tapé — comparez-la à RGB(...), qui empile de la même façon qu'Excel. Tester
If .Interior.Color = RGB(68,114,196) est correct ; If .Interior.Color = &H4472C4 est le bug BGR
à l'envers.
Un seul modèle de couleur, partout
Le bénéfice de l'apprendre une fois, c'est que c'est le même nombre partout où une couleur apparaît.
La valeur RGB(...) identique fonctionne sur :
ws.Range("A1").Interior.Color = RGB(68, 114, 196) ' remplissage
ws.Range("A1").Font.Color = RGB(255, 255, 255) ' texte
ws.Range("A1").Borders.Color = RGB(0, 0, 0) ' lignes de bordure
ws.Tab.Color = RGB(68, 114, 196) ' onglet de feuille
Il n'y a pas de format de couleur à réapprendre par objet. Remplissage, police, bordure, onglet, série
de graphique — tous prennent l'unique Long 24 bits. Voilà pourquoi il est payant de réussir
l'empilage une bonne fois : le remède et l'habitude se transfèrent à chaque chose colorée du modèle
objet. (L'ancienne propriété ColorIndex est l'exception — un emplacement de palette, pas ce nombre ;
voir VBA ColorIndex.)
Le jugement : nommez votre palette une fois
Éparpiller RGB(255, 242, 204) sur une centaine de lignes, c'est ainsi qu'un rapport finit avec trois
« ors » légèrement différents. Définissez la palette une fois, en tête du module, en constantes
nommées — alors la couleur a un nom, vit en un seul endroit, et se change en un instant :
Private Const CLR_HEADER As Long = 4759559 ' RGB(68,114,196) empile une fois
Private Const CLR_WARN As Long = 13551615 ' RGB(255,199,206)
Ou gardez-les en RGB(...) dans un petit assistant. Dans les deux cas, la règle est la même que celle
qui régit les constantes en général : une valeur qui signifie quelque chose
devrait avoir un nom, et non être retapée. Construisez avec RGB, stockez en un seul endroit, et le
piège BGR ne pourra jamais mordre puisque vous n'écrivez jamais d'hexa empilé à la main.
Comment ExcelMaster aide
L'inversion BGR est un bug véritablement vicieux, car le code est valide et la couleur est simplement
fausse — un bleu de marque qui part en orange, une comparaison qui ne correspond jamais parce qu'elle
teste un hexa brut contre une valeur BGR. Il coûte une après-midi précisément parce que rien ne lève
d'erreur.
ExcelMaster vous laisse donner une
couleur telle que vous l'avez vraiment — « utilise #4472C4 », « mets notre vert de marque », « 255,
242, 204 » — et il écrit RGB(...) avec les canaux dans les bonnes molettes, jamais un hexa aux octets
inversés. Demandez-lui de « surligner les cellules qui correspondent à la couleur de l'en-tête » et il
compare à RGB(...), pas à un littéral brut, pour que la correspondance fonctionne réellement. Quand
vous réutilisez une couleur, il la hisse en constante nommée. Vous gardez le classeur et le code, moins
l'après-midi perdue sur des canaux intervertis.
Questions fréquentes
Comment fonctionne la fonction RGB en VBA ?
RGB(red, green, blue) prend trois canaux, chacun de 0 à 255, et renvoie un seul nombre Long
qu'Excel utilise comme couleur : RGB(255, 242, 204) est un or doux. En interne, elle calcule
red + green*256 + blue*65536, si bien que le nombre est une couleur 24 bits que vous pouvez affecter
à n'importe quelle propriété de couleur — Interior.Color, Font.Color, Borders.Color, etc.
Pourquoi ma couleur est-elle fausse quand j'utilise un code hexa en VBA ?
Parce qu'Excel stocke les couleurs en ordre BGR (bleu octet haut, rouge octet bas), soit l'inverse
d'un hexa web comme #RRGGBB. Affecter .Color = &H4472C4 le lit en BGR et intervertit le rouge et
le bleu. Éclatez plutôt l'hexa en canaux — .Color = RGB(&H44, &H72, &HC4) — ou inversez le littéral
en &HC47244.
Comment convertir une couleur hexa en RGB en VBA ?
Éclatez l'hexa en ses trois paires d'octets et passez-les à RGB : pour #4472C4, écrivez
RGB(&H44, &H72, &HC4). Cela garde chaque canal dans la bonne molette et évite le piège d'ordre des
octets BGR que vous rencontrez si vous affectez l'hexa empilé directement à .Color.
Comment récupérer les valeurs rouge, vert et bleu d'une couleur ?
Lisez le Long empilé depuis .Color, puis décomposez-le : r = c Mod 256, g = (c \ 256) Mod 256,
b = c \ 65536. Comme Excel stocke la valeur en BGR, le rouge est l'octet bas et le bleu l'octet
haut — cela inverse exactement ce que RGB a empilé.
Quelles sont les constantes de couleur vb en VBA ?
VBA fournit huit constantes nommées — vbBlack, vbWhite, vbRed, vbGreen, vbBlue, vbYellow,
vbMagenta, vbCyan — chacune égale à une valeur RGB(...) (vbRed = 255 = RGB(255,0,0)). Elles
sont pratiques pour les primaires, mais pour toute couleur précise ou de marque, utilisez
RGB(r, g, b) afin de contrôler les trois canaux.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 08/09/2026.
Guides associés : VBA ColorIndex · VBA Cell Color · VBA Font · VBA Conditional Formatting · VBA Constant
