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

VBA ColorIndex dans Excel — la palette de 56 couleurs et pourquoi votre couleur ressort fausse

|

VBA ColorIndex dans Excel — la palette de 56 couleurs et pourquoi votre couleur ressort fausse

En brefColorIndex n'est pas une couleur. C'est un numéro de siège — un index de 1 à 56 dans une palette qui appartient au classeur. .Color désigne une couleur absolue ; .ColorIndex dé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(...) ; gardez ColorIndex pour les deux choses que .Color ne sait pas exprimer — xlNone (aucun remplissage) et xlColorIndexAutomatic — 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 — ColorIndex est 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 — .Color et .ColorIndex sont 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 — xlNone et xlColorIndexAutomatic — que .Color ne sait pas exprimer
  • Relire une couleur, et pourquoi lire .ColorIndex sur une cellule définie par .Color perd de l'information
  • Quand ColorIndex reste 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 = 10 peut ê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 xlNone ou xlColorIndexAutomatic — 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