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

VBA Cell Color dans Excel — définir le remplissage d'arrière-plan en code (et pourquoi la couleur n'est pas une donnée)

|

VBA Cell Color dans Excel — définir le remplissage d'arrière-plan en code (et pourquoi la couleur n'est pas une donnée)

En bref — La couleur d'arrière-plan d'une cellule se trouve sur son objet Interior : Range("A1").Interior.Color = RGB(255, 242, 204). C'est la couche de remplissage — la peinture derrière le texte — et comme toute mise en forme, elle change l'apparence, pas la valeur. Deux choses piègent tout le monde. Premièrement, effacer un remplissage se fait avec Interior.ColorIndex = xlNone, ce qui n'est pas pareil que le peindre en blanc. Deuxièmement, et c'est plus important : la couleur n'est pas une donnée. SUM et SUMIF ne la voient pas, si bien qu'un classeur qui utilise la couleur de remplissage pour signifier « approuvé » range une catégorie là où aucune formule ne peut la lire.

' Surligner toute la ligne d'en-tete avec un remplissage or leger.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sales")
ws.Range("A1:F1").Interior.Color = RGB(255, 242, 204)

' Retirer entierement un remplissage (retour a "No Fill", pas blanc).
ws.Range("A2:F2").Interior.ColorIndex = xlNone

Remplir des cellules de couleur est l'une des tâches les plus automatisées d'Excel, et elle partage exactement son modèle de couleur avec la couche Font — la même distinction entre Color et ColorIndex. Ce guide se concentre sur ce qui est propre au remplissage : l'effacer correctement, et l'idée plus large qu'une cellule colorée est une décoration, pas une information. Une fois que ça fait tilt, la question « comment additionner les cellules jaunes » se répond d'elle-même — on ne le fait pas, on corrige les données.

Ce que vous allez apprendre

  • Le modèle mental — Interior est la couche de remplissage, posée derrière le texte
  • Définir la couleur de remplissage avec RGB, et l'effacer avec xlNone (pas du blanc)
  • La règle la plus importante — la couleur ne porte aucune donnée, et aucune formule ne peut la lire
  • Surligner selon une condition sans boucle qui se périme
  • Remplir rapidement de nombreuses plages disjointes avec Union
  • Relire une couleur de remplissage, et le piège de xlNone

Le modèle mental : Interior est la couche de remplissage

Une cellule possède trois couches visuelles, chacune atteinte par son propre objet : le texte (Font), le remplissage derrière lui (Interior), et la façon dont le nombre est affiché (NumberFormat). Interior est celle du milieu — la peinture sur le mur, derrière l'écriture. Sa propriété principale est Color, et elle utilise un modèle de couleur identique à celui de Font : RGB(r, g, b) pour n'importe quelle couleur, ou ColorIndex pour l'ancienne palette de 56 emplacements.

Comme elle partage le modèle de couleur, la règle du guide sur la police s'applique ici aussi : définissez avec .Color = RGB(...), et ne confondez jamais .Color avec .ColorIndex. Interior.Color = 6 est un quasi-noir RGB(6,0,0) ; Interior.ColorIndex = 6 est jaune. Restez dans un seul espace de nombres.

Effacer un remplissage : xlNone n'est pas du blanc

Voici le premier piège propre au remplissage. Pour retirer un arrière-plan, deux choses semblent identiques à l'écran sans l'être :

ws.Range("A1").Interior.Color = RGB(255, 255, 255)   ' le PEINT en blanc
ws.Range("A1").Interior.ColorIndex = xlNone          ' RETIRE le remplissage (No Fill)

Sur une feuille vierge, les deux paraissent blanches, on peut donc croire qu'elles sont équivalentes. Elles ne le sont pas. Un remplissage blanc reste un remplissage — il masque le quadrillage, il s'imprime en bloc blanc, et il rapporte Interior.Pattern = xlSolid. xlNone signifie aucun remplissage du tout : le quadrillage transparaît, rien ne s'imprime, et la cellule est réellement dépourvue de mise en forme. Quand vous réinitialisez une plage — par exemple, effacer les surlignages de la dernière exécution avant d'en appliquer de nouveaux — vous voulez presque toujours xlNone, pas du blanc. Peindre en blanc est un bug qui se révèle plus tard, sur une impression ou par-dessus une feuille colorée, là où le bloc blanc se met soudain à ressortir.

La règle la plus importante : la couleur n'est pas une donnée

C'est l'idée qui sépare un classeur propre d'un classeur fragile. Une couleur de remplissage ne porte aucune valeur. Aucune formule ne peut la lire. SUM additionne une cellule jaune exactement comme une cellule blanche ; SUMIF, COUNTIF et IF n'ont aucun opérateur pour « est surlignée ». Alors dès que vous utilisez la couleur pour signifier quelque chose — les cellules or sont approuvées, les lignes rouges sont en retard, le vert signifie payé — vous avez rangé une catégorie dans un endroit que le moteur de calcul ne voit pas.

' Si "approved" compte, sa place est dans une valeur, pas juste une couleur.
ws.Range("H2").Value = "Approved"                    ' une formule peut lire ceci
ws.Range("A2:H2").Interior.Color = RGB(198, 239, 206) ' la couleur est la consequence, pas la source

La règle pratique : mettez le sens dans une cellule, et laissez la couleur suivre. Ajoutez une colonne Status, écrivez-y « Approved » ou « Overdue », et pilotez le remplissage à partir de là (idéalement avec la Mise en forme conditionnelle, plus bas). Dès lors COUNTIF(Status, "Overdue") fonctionne, les filtres fonctionnent, les tableaux croisés dynamiques fonctionnent — et la couleur n'est plus que l'écho visuel d'une valeur qui existe vraiment. Certains recourent bel et bien à la « somme par couleur » via .Interior.ColorIndex dans une boucle, et c'est faisable, mais en avoir besoin est presque toujours le signe que la catégorie aurait dû être une vraie valeur dès le départ.

Surligner selon une condition : une règle, pas une boucle qui se périme

Tout comme la couleur de police, piloter la couleur de remplissage depuis une condition avec une simple boucle produit un instantané ponctuel qui pourrit à l'instant même où les données changent :

' Instantane seulement - a relancer apres chaque modification.
Dim c As Range
For Each c In ws.Range("B2:B1000")
    If c.Value < 0 Then c.Interior.Color = RGB(255, 199, 206)
Next c

Pour une couleur qui doit suivre les valeurs vivantes, posez une fois une règle de Mise en forme conditionnelle et laissez Excel la réévaluer pour toujours :

With ws.Range("B2:B1000").FormatConditions
    .Delete
    .Add(Type:=xlCellValue, Operator:=xlLess, Formula1:="0").Interior.Color = RGB(255, 199, 206)
End With

Réservez la boucle Interior.Color directe au surlignage statique — un rapport unique que vous vous apprêtez à figer et exporter. Pour tout ce qui doit rester correct au fil des modifications de la feuille, FormatCondition est le bon outil. C'est le même arbitrage que pour la couche police, et il vaut la peine de l'assimiler une bonne fois : les boucles peignent des instantanés, les règles restent vivantes.

Remplir rapidement de nombreuses plages avec Union

Définir le remplissage d'une plage est instantané. Colorer des centaines de cellules éparses une par une dans une boucle est lent, car chaque affectation est un aller-retour distinct vers Excel. Regroupez les cellules dans une seule plage avec Union et peignez-les d'un seul coup :

Dim target As Range, c As Range
For Each c In ws.Range("B2:B1000")
    If c.Value < 0 Then
        If target Is Nothing Then Set target = c Else Set target = Union(target, c)
    End If
Next c
If Not target Is Nothing Then target.Interior.Color = RGB(255, 199, 206)

La boucle décide encore quelles cellules, mais la partie coûteuse — appliquer réellement le remplissage — n'a lieu qu'une fois pour tout l'Union au lieu de mille fois. (Pour un bloc contigu, vous n'avez pas besoin d'Union du tout ; colorez toute la Range en une seule instruction.) La règle générale, valable pour chaque couche de mise en forme : décidez dans la boucle, appliquez à la plage.

Relire une couleur de remplissage

Relire Interior.Color renvoie la valeur 24 bits que vous avez définie (stockée en interne au format BGR, comparez-la donc à un RGB(...) plutôt que de lire l'entier brut). La seule chose à surveiller est le cas « aucun remplissage » :

Debug.Print ws.Range("A1").Interior.ColorIndex   ' -4142 (xlNone) quand il n'y a aucun remplissage
Debug.Print ws.Range("A1").Interior.Color        ' 16777215 pour un remplissage blanc - a l'air "blanc", pas "vide"

Si vous devez savoir si une cellule est sans remplissage, testez Interior.ColorIndex = xlNone, et non la valeur Color — car une cellule explicitement blanche renvoie un Color valide et tromperait une vérification fondée sur la couleur. C'est l'écho, côté lecture, de la règle « le blanc n'est pas xlNone » vue plus haut.

Comment ExcelMaster aide

Les remplissages de cellule semblent simples jusqu'à ce que les cas limites surgissent : xlNone face au blanc, une boucle de surlignage qui aurait dû être une règle, la couleur employée comme catégorie qu'aucune formule ne peut lire, et une boucle cellule par cellule qui traîne. Chacun est un bug silencieux — un surlignage périmé, un contournement « somme par couleur », une macro lente.

ExcelMaster vous laisse décrire le résultat. Dites « surligne les lignes en retard » ou « ombre l'en-tête et efface les couleurs du mois dernier », et il écrit Interior.Color = RGB(...) pour une passe statique ou un FormatCondition quand la couleur doit suivre les données, efface avec xlNone au lieu de peindre en blanc, et applique à toute la plage d'un coup. Et quand vous lui demandez de « marquer les commandes approuvées », il place d'abord le statut dans une vraie colonne — pour que la couleur signifie quelque chose qu'une formule peut réellement compter. Vous gardez le classeur et le code.

Questions fréquentes

Comment définir la couleur d'arrière-plan d'une cellule en VBA Excel ?

Utilisez Range("A1").Interior.Color = RGB(red, green, blue) — par exemple RGB(255, 242, 204) pour un or doux. Interior est l'objet de remplissage et Color prend une valeur RGB 24 bits qui couvre toutes les couleurs. N'utilisez Interior.ColorIndex = n (un emplacement de palette de 1 à 56) que pour vous aligner sur un ancien classeur fondé sur une palette, et ne mélangez pas les deux espaces de nombres.

Comment retirer ou effacer la couleur de remplissage d'une cellule en VBA ?

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. Affecter Interior.Color = RGB(255,255,255) ne fait que peindre la cellule en blanc, ce qui reste un remplissage et se comporte différemment à l'impression et par-dessus des feuilles colorées. Pour réinitialiser des surlignages, utilisez xlNone.

Puis-je faire la somme ou compter des cellules selon leur couleur en VBA ?

Pas avec SUM, SUMIF ni COUNTIF — ces formules ne voient absolument pas la couleur de remplissage. Vous pouvez inspecter Interior.Color ou Interior.ColorIndex cellule par cellule dans une boucle VBA, mais en avoir besoin est le signe que la catégorie devrait être une vraie valeur. Mettez « Approved » ou « Overdue » dans une colonne Status et comptez cela plutôt ; laissez la couleur être l'écho visuel de la valeur.

Pourquoi mon surlignage se périme-t-il après que j'ai modifié la feuille ?

Parce qu'une boucle For Each ... Interior.Color applique un instantané ponctuel ; elle ne se relance pas quand les valeurs changent. Pour une couleur de remplissage qui doit suivre les données, ajoutez une règle de Mise en forme conditionnelle avec Range(...).FormatConditions.Add, qu'Excel réévalue automatiquement. N'utilisez une boucle de remplissage directe que pour un rapport statique que vous comptez figer.

Comment colorer rapidement de nombreuses cellules éparses en VBA ?

Construisez une seule Range avec Union à l'intérieur de votre boucle, puis définissez .Interior.Color sur cette plage combinée une seule fois, au lieu de colorer chaque cellule au fur et à mesure. Appliquer le remplissage une fois à tout l'Union évite un aller-retour distinct par cellule. Pour un bloc contigu, laissez tomber Union et colorez toute la plage en une seule instruction.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 11/08/2026.

Guides associés : VBA Font · VBA NumberFormat · VBA Range · VBA With · VBA For Loop