En bref —
ColorIndexn'est pas une couleur. C'est un numéro de siège — un index de 1 à 56 dans une palette qui appartient au classeur..Colordésigne une couleur absolue ;.ColorIndexdésigne un emplacement, et qui occupe cet emplacement peut changer d'un classeur à l'autre. Voilà pourquoi le même index paraît or sur votre poste et moutarde chez un collègue. Pour du code neuf, fixez une couleur absolue avec.Color = RGB(...); gardezColorIndexpour les deux choses que.Colorne sait pas exprimer —xlNone(aucun remplissage) etxlColorIndexAutomatic— et pour vous aligner sur un ancien classeur fondé sur une palette.
' Deux espaces de nombres distincts. Ne les melangez pas.
Range("A1").Interior.ColorIndex = 6 ' emplacement 6 de la palette -> jaune (en general)
Range("A2").Interior.Color = RGB(255, 255, 0) ' une couleur absolue -> jaune, toujours
' Les deux valeurs speciales que seul ColorIndex sait exprimer :
Range("A3").Interior.ColorIndex = xlNone ' retirer entierement le remplissage
Range("A4").Font.ColorIndex = xlColorIndexAutomatic ' "laisser Excel decider" (texte noir)
Chaque objet porteur de couleur dans Excel — un remplissage de cellule
(Interior), la Font, les Borders,
une série de graphique — expose à la fois une propriété Color et une propriété ColorIndex. Elles
visent le même pixel, mais à travers deux systèmes de nombres complètement différents, et les confondre
est le bug « pourquoi ma couleur est fausse » le plus répandu de tout VBA. Ce guide traite du plus
ancien des deux — l'index de palette — car comprendre ce qu'il est réellement éclaire toute une
catégorie de problèmes de couleurs qui « ne s'affichent pas pareil ».
Ce que vous allez apprendre
- Le modèle mental —
ColorIndexest un numéro de siège dans une salle de 56 places, pas une couleur - La règle qui évite la plupart des couleurs fausses —
.Coloret.ColorIndexsont des espaces de nombres différents - Le piège de la palette — pourquoi un index peut se rendre différemment dans un autre classeur
- Les deux valeurs spéciales —
xlNoneetxlColorIndexAutomatic— que.Colorne sait pas exprimer - Relire une couleur, et pourquoi lire
.ColorIndexsur une cellule définie par.Colorperd de l'information - Quand
ColorIndexreste le bon outil, et quand préférer.Color
Le modèle mental : un numéro de siège, pas une couleur
Imaginez une salle de spectacle avec 56 sièges numérotés. ColorIndex = 6 ne signifie pas « jaune ».
Cela signifie « celui ou celle qui occupe le siège 6 ». Dans un classeur par défaut, le siège 6 se
trouve occupé par du jaune, si bien que le jaune semble intégré d'origine. Mais le plan de salle — la
palette de couleurs du classeur — appartient au classeur, et il peut être réattribué. Placez une
autre couleur dans le siège 6 et chaque cellule réglée sur ColorIndex = 6 change d'un coup, sans que
votre code ne touche à quoi que ce soit.
.Color, à l'inverse, n'est pas du tout un numéro de siège. Interior.Color = RGB(255, 255, 0)
inscrit la couleur réelle dans la cellule. Aucune consultation, aucun plan, rien à réattribuer. Cette
différence — emplacement contre valeur absolue — est toute l'histoire, et c'est la raison pour
laquelle les deux propriétés se comportent si différemment quand un classeur passe d'une machine ou
d'un thème à un autre.
La règle qui compte le plus : deux espaces de nombres, jamais mélangés
Voici l'erreur qui produit la plupart des couleurs fausses. .Color et .ColorIndex acceptent des
nombres de plages totalement différentes, et un nombre valide pour l'une est aussi valide — et veut
dire autre chose — pour l'autre :
Range("A1").Interior.Color = 6 ' Espace Color : 6 = RGB(6,0,0) -> quasi-noir
Range("A1").Interior.ColorIndex = 6 ' Espace index : emplacement 6 -> jaune
Personne ne veut dire « quasi-noir » en tapant 6, pourtant .Color = 6 donne exactement cela, en
silence. Le remède est une discipline, pas une astuce : décidez dans quel espace vous êtes et
restez-y. Si la ligne dit .Color, la partie droite est une valeur RGB(...) ou une constante
vb*. Si elle dit .ColorIndex, la partie droite est un entier de 1 à 56 (ou une valeur spéciale
ci-dessous). Lire une valeur .Color dans une propriété ColorIndex, ou l'inverse, est toujours un
bug, même quand cela compile et s'exécute.
Le piège de la palette : pourquoi l'index se rend différemment ailleurs
C'est le vrai coût du modèle du numéro de siège. Parce que ColorIndex est une consultation dans
ActiveWorkbook.Colors(n), la couleur qu'il produit n'est stable que dans la mesure où cette palette
l'est. Deux choses déplacent les sièges :
- Un classeur bâti à partir d'un modèle dont la palette a été personnalisée possède déjà des
couleurs différentes dans certains emplacements. Votre
ColorIndex = 10peut être vert forêt dans votre fichier et olive boueux dans le leur. - Du code peut réécrire directement la palette (
ActiveWorkbook.Colors(10) = RGB(...)), et les couleurs de thème modernes ajoutent une couche de réattribution supplémentaire par-dessus.
Ainsi une macro qui remplit des en-têtes de rapport avec ColorIndex = 37 paraît parfaite sur la
machine où elle a été écrite et subtilement décalée sur celle du client — même code, même index, plan
de salle différent. .Color = RGB(...) n'a pas ce mode de défaillance, car il n'interroge jamais la
palette. Quand une couleur doit paraître identique partout, c'est l'argument décisif : une couleur
absolue voyage, un index de palette non.
Les deux valeurs spéciales : xlNone et xlColorIndexAutomatic
Il y a une tâche que seul ColorIndex sait accomplir, et c'est la raison honnête de le conserver.
.Color sait exprimer n'importe laquelle des 16 millions de couleurs — mais il ne sait pas exprimer
« aucune couleur ». Deux constantes négatives comblent ce manque :
Range("A1").Interior.ColorIndex = xlNone ' -4142 : aucun remplissage (le quadrillage transparait)
Range("A1").Font.ColorIndex = xlColorIndexAutomatic ' -4105 : automatique (noir sur blanc, selon le theme)
xlNone est la bonne façon de retirer un remplissage — réellement vide, pas peint en blanc (un
remplissage blanc reste un remplissage ; voir VBA Cell Color).
xlColorIndexAutomatic est le défaut de la police : il signifie « quelle que soit la couleur
automatique d'Excel », qui suit le thème et bascule intelligemment sur fond sombre, là où un
RGB(0,0,0) codé en dur ne le ferait pas. Ni l'une ni l'autre n'a d'équivalent .Color, c'est donc
le seul endroit où ColorIndex n'est pas qu'un vestige — c'est le seul outil pour la tâche.
Relire une couleur : ColorIndex perd de l'information
La lecture est là où les deux espaces vous mordent une seconde fois. Si une cellule a été remplie
d'une couleur absolue, demander son ColorIndex ne vous rend pas une réponse propre — Excel renvoie
l'emplacement de palette le plus proche, ce qui jette la couleur exacte :
Range("A1").Interior.Color = RGB(200, 215, 240) ' un bleu doux precis
Debug.Print Range("A1").Interior.ColorIndex ' un numero d'emplacement voisin - PAS votre couleur
Debug.Print Range("A1").Interior.Color ' la valeur 24 bits exacte que vous avez definie
La règle de lecture est le miroir de la règle d'écriture : relisez avec la même propriété que celle
qui a servi à définir. Si vous avez défini .Color, comparez .Color (à un RGB(...), puisqu'elle
est stockée en BGR — voir VBA RGB). Ne testez .ColorIndex que lorsque
l'emplacement vous importe précisément — par exemple, If .Interior.ColorIndex = xlNone pour
détecter une cellule sans remplissage, qui est la seule lecture où ColorIndex est exactement le bon
choix.
Quand ColorIndex reste le bon outil
Ce n'est pas « à éviter toujours ». Recourez à ColorIndex quand :
- Vous avez besoin de
xlNoneouxlColorIndexAutomatic— il n'y a aucun autre moyen de les dire. - Vous vous alignez sur un classeur qui a été bâti sur la palette de 56 couleurs et vous voulez que vos remplissages suivent son schéma, volontairement.
- Vous lisez une cellule seulement pour demander « remplie ou non » (
= xlNone).
Pour tout le reste — un rapport qui doit paraître identique pour chaque lecteur, une couleur de marque,
tout ce que vous comparerez plus tard — fixez .Color = RGB(...). Le jugement est simple une fois le
modèle clair : un numéro de siège est commode dans une salle et vide de sens en dehors. La couleur
absolue est le défaut ; l'index de palette est un choix délibéré et étroit.
Comment ExcelMaster aide
La distinction Color/ColorIndex est exactement le genre de détail qui compile, s'exécute, puis
produit une couleur que vous ne vouliez pas — 6 lu comme quasi-noir, un en-tête qui change de teinte
sur la copie du client, une lecture de ColorIndex qui arrondit discrètement votre couleur à un
emplacement de palette. Rien de tout cela ne lève d'erreur ; cela paraît simplement faux plus tard.
ExcelMaster vous laisse décrire
la couleur voulue — « remplis l'en-tête en bleu foncé », « efface les surlignages de la dernière
exécution », « utilise notre vert de marque » — et il écrit .Color = RGB(...) pour des couleurs
absolues qui paraissent identiques partout, ColorIndex = xlNone quand vous voulez dire retirer le
remplissage, et xlColorIndexAutomatic pour une police qui doit suivre le thème. Il reste dans un
seul espace de nombres par ligne, pour que le bug « pourquoi ma couleur est décalée » ne parte jamais
en production. Vous gardez le classeur et le code.
Questions fréquentes
Quelle est la différence entre Color et ColorIndex en VBA ?
.Color est une valeur absolue 24 bits — Interior.Color = RGB(255,255,0) est jaune sur toutes les
machines. .ColorIndex est un numéro d'emplacement de 1 à 56 dans la palette du classeur ;
Interior.ColorIndex = 6 est « la couleur qui occupe l'emplacement 6 », qu'une palette personnalisée
ou un thème peut changer. Ils utilisent des plages de nombres différentes, donc n'affectez jamais la
valeur de l'un à l'autre — .Color = 6 est quasi-noir, pas l'emplacement 6.
Pourquoi le même ColorIndex paraît-il différent dans un autre classeur ?
Parce que ColorIndex est une consultation dans la palette de ce classeur (ActiveWorkbook.Colors),
et la palette peut différer d'un fichier à l'autre — un modèle peut la personnaliser, ou des couleurs
de thème peuvent la réattribuer. L'index est stable, mais la couleur derrière lui ne l'est pas. Si une
couleur doit paraître identique pour tout le monde, fixez plutôt une .Color = RGB(...) absolue, qui
ne consulte jamais la palette.
Comment retirer un remplissage de cellule avec ColorIndex ?
Affectez Range("A1").Interior.ColorIndex = xlNone. Cela retire entièrement le remplissage, si bien
que le quadrillage transparaît et que rien ne s'imprime — contrairement à
Interior.Color = RGB(255,255,255), qui peint la cellule en blanc et reste un remplissage. xlNone
(valeur -4142) est l'une des deux tâches que .Color ne sait pas faire, et c'est pourquoi ColorIndex
vaut la peine d'être gardé pour cela.
Qu'est-ce que xlColorIndexAutomatic ?
xlColorIndexAutomatic (valeur -4105) est la couleur « automatique » — pour Font.ColorIndex, elle
désigne la couleur de texte par défaut qui suit le thème d'Excel, généralement noire sur fond clair et
s'adaptant sur fond sombre. C'est le défaut sûr pour la couleur de police, car un RGB(0,0,0) codé en
dur ne peut pas s'adapter. Il n'y a pas d'équivalent .Color, vous le définissez donc via
ColorIndex.
Faut-il utiliser ColorIndex ou RGB pour du nouveau code VBA ?
Préférez .Color = RGB(...) pour du code neuf : c'est une couleur absolue qui paraît identique dans
chaque classeur et sur chaque machine, et elle couvre les 16 millions de couleurs plutôt que 56
emplacements. Réservez ColorIndex aux valeurs spéciales xlNone et xlColorIndexAutomatic, à
l'alignement sur un classeur délibérément bâti sur la palette historique, et à la lecture « cette
cellule est-elle remplie » (= xlNone).
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 08/09/2026.
Guides associés : VBA RGB · VBA Conditional Formatting · VBA Cell Color · VBA Font · VBA Borders
