🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

La fonction VBA RGB dans Excel — comment une couleur devient un nombre (et le piège BGR)

|

La fonction VBA RGB dans Excel — comment une couleur devient un nombre (et le piège BGR)

En bref — La .Color d'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 : RGB le construit en rouge en bas, bleu en haut (r + g*256 + b*65536), soit l'inverse d'un code hexadécimal web. Coller #4472C4 tel quel dans .Color = &H4472C4 intervertit donc le rouge et le bleu et vous donne la mauvaise couleur. Construisez toujours vos couleurs avec RGB(...), 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 — .Color est un seul nombre, et RGB est 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