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

VBA Font dans Excel — définir la couleur, le gras et la taille en code (et le piège de ColorIndex)

|

VBA Font dans Excel — définir la couleur, le gras et la taille en code (et le piège de ColorIndex)

En brefRange.Font est la couche texte d'une cellule : couleur, gras, italique, taille, nom. Rien de tout cela ne change la valeur en dessous — un nombre rouge reste un simple nombre. La couleur est la seule partie qui piège tout le monde, parce qu'il existe trois façons de la définir et que deux d'entre elles vivent dans des espaces de nombres différents. Utilisez Range("A1").Font.Color = RGB(200, 0, 0) pour n'importe quelle couleur. N'utilisez Range("A1").Font.ColorIndex = 3 que si vous travaillez avec l'ancienne palette de 56 emplacements d'Excel — et ne mélangez jamais les deux, car .Color = 3 et .ColorIndex = 3 sont deux rouges complètement différents.

' Mettre la ligne d'en-tete en gras et bleu fonce - une instruction par propriete.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sales")
With ws.Range("A1:F1").Font
    .Bold = True
    .Color = RGB(0, 32, 96)     ' RGB 24 bits - ce que vous voulez 95% du temps
    .Size = 12
End With

Changer l'apparence du texte est la première chose que la plupart des gens automatisent en VBA, et c'est aussi là que se cache le bug le plus déroutant de tout le langage — la différence entre .Color et .ColorIndex. Ce guide s'articule autour d'une seule idée qui rend tout le reste évident : l'objet Font ne contrôle que l'apparence, et sa propriété de couleur existe en deux versions incompatibles. Assimilez cela et le gras, la taille, le nom et le formatage partiel se mettent tous en place.

Ce que vous allez apprendre

  • Le modèle mental — Font est la couche texte, et elle ne touche jamais à la valeur
  • La règle la plus importante — .Color (RGB) et .ColorIndex (palette) sont des espaces de nombres différents
  • Le gras, l'italique, la taille et le nom — le reste de la couche texte, défini avec With
  • Formater une partie de cellule avec Characters, et quand cela ne fait rien silencieusement
  • Pourquoi la coloration selon la valeur relève de la Mise en forme conditionnelle, pas d'une boucle
  • Relire une couleur de police sans tomber sur un nombre surprise

Le modèle mental : Font est la couche texte

Une cellule possède trois couches visuelles que VBA atteint par trois objets différents : le texte (son Font), le remplissage derrière lui (son Interior), et la façon dont le nombre est affiché (son NumberFormat). Ce guide traite de la première couche. Chaque propriété sous Range.FontColor, Bold, Italic, Underline, Size, Name, Strikethrough — change l'apparence des caractères et rien d'autre.

C'est tout l'enjeu, et il vaut la peine de le dire clairement, car c'est la source d'un malentendu courant : colorer du texte ne l'étiquette pas. Une cellule dont vous passez la police en rouge contient toujours le même nombre, alimente toujours les mêmes formules, et reste invisible pour SUM, SUMIF et IF. La couleur est faite pour l'œil humain, pas pour le moteur de calcul d'Excel. Si vous vous surprenez à utiliser la couleur de police pour signifier quelque chose — « les cellules rouges sont en retard » — inscrivez ce sens dans une vraie valeur, quelque part où une formule peut la lire, et laissez la couleur en être la conséquence.

La règle la plus importante : Color et ColorIndex sont des espaces de nombres différents

Voici la seule chose à retenir. Il existe deux propriétés de couleur sur Font, et elles ne parlent pas la même langue.

' .Color prend une valeur RGB 24 bits. Construisez-la avec RGB(red, green, blue), 0-255 chacun.
ws.Range("A1").Font.Color = RGB(200, 0, 0)      ' un rouge soutenu

' .ColorIndex prend un emplacement de palette, 1 a 56, de la table de couleurs historique d'Excel.
ws.Range("A2").Font.ColorIndex = 3              ' rouge aussi - mais un rouge DIFFERENT

Les deux lignes colorent le texte en rouge, elles semblent donc interchangeables. Elles ne le sont pas. .Color = 3 ne vous donnerait pas le rouge de ColorIndex 3 — il vous donnerait RGB(3, 0, 0), un quasi-noir. Le nombre 3 signifie « emplacement de palette 3 » pour ColorIndex et « la minuscule valeur RGB 3 » pour Color. Donner à une propriété le nombre de l'autre est le bug de police numéro un, et il échoue en silence : aucune erreur, juste la mauvaise couleur.

La règle est simple. Définissez la couleur avec .Color = RGB(r, g, b) — elle couvre les 16 millions de couleurs et se relit exactement comme vous l'avez écrite. Ne recourez à .ColorIndex que dans deux situations : vous vous alignez sur un classeur existant fondé sur une palette, ou vous voulez l'une des deux valeurs spéciales sans équivalent RGB :

ws.Range("A1").Font.ColorIndex = xlColorIndexAutomatic   ' retour a la couleur automatique du theme
ws.Range("A1").Font.ColorIndex = xlColorIndexNone        ' (Interior uniquement, montre plus loin)

xlColorIndexAutomatic est réellement utile — il ramène la couleur de police à « automatique » (habituellement noire, mais sensible au thème), ce qu'aucune valeur RGB unique n'exprime. Pour tout le reste, .Color avec RGB est le choix honnête.

Le gras, la taille, le nom : le reste de la couche texte

Les autres propriétés de police sont d'un ennui rafraîchissant — de simples booléens, nombres et chaînes. Comme vous en définissez généralement plusieurs à la fois, With garde le tout lisible et évite de réévaluer la plage à chaque fois (la même raison qu'expose VBA With) :

With ws.Range("B2:B50").Font
    .Bold = True
    .Italic = False
    .Underline = xlUnderlineStyleSingle
    .Size = 11                 ' points
    .Name = "Calibri"
    .Color = RGB(0, 0, 0)
End With

Deux ou trois choses à savoir. .Bold, .Italic et .Strikethrough valent True/False. .Size s'exprime en points, pas en pixels. .Name est la police sous forme de chaîne, et si vous l'orthographiez mal ou nommez une police non installée, Excel substitue silencieusement une police par défaut au lieu de lever une erreur — un bug « rien ne s'est passé » est donc le plus souvent une faute de frappe dans le nom de la police.

Formater une partie de cellule : Characters()

Tout ce qui précède formate la cellule entière. Pour mettre en forme une partie du texte — passer le premier mot en gras, colorer un suffixe — utilisez Characters(start, length) :

' Mettre en gras uniquement les 4 premiers caracteres de A1.
ws.Range("A1").Characters(Start:=1, Length:=4).Font.Bold = True

C'est puissant, mais il y a une limite ferme qui piège les gens : Characters ne fonctionne que sur une cellule contenant une chaîne littérale. Si la cellule contient une formule, un nombre ou une date, il n'y a aucun caractère modifiable à adresser et l'appel ne fait rien (ou déclenche une erreur). Le formatage partiel est une propriété du texte saisi, pas des résultats calculés — il est donc réservé aux libellés et aux notes, pas aux cellules que votre code va écraser.

Ne bouclez pas pour colorer selon la valeur — c'est le travail de la Mise en forme conditionnelle

Voici la partie tranchée, et c'est elle qui épargne le plus d'ennuis. La macro classique du débutant parcourt une plage et colore les cellules qui remplissent une condition :

' Tentant, mais se perime des que les donnees changent.
Dim c As Range
For Each c In ws.Range("B2:B1000")
    If c.Value < 0 Then c.Font.Color = RGB(200, 0, 0)
Next c

Elle fonctionne exactement une fois. La couleur est un instantané pris au moment de l'exécution de la boucle ; modifiez une valeur ensuite et la mise en forme est désormais fausse, car rien ne la réévalue. La couleur pilotée par la valeur, c'est précisément la raison d'être de la Mise en forme conditionnelle, et vous pouvez la configurer depuis VBA aussi :

' Definissez la REGLE une fois ; Excel la garde correcte pour toujours.
With ws.Range("B2:B1000").FormatConditions
    .Delete
    .Add(Type:=xlCellValue, Operator:=xlLess, Formula1:="0").Font.Color = RGB(200, 0, 0)
End With

N'utilisez une boucle Font.Color directe que pour un marquage statique et ponctuel — un rapport que vous vous apprêtez à exporter en PDF, un instantané que vous voulez figer. Dès que la coloration doit suivre des données vivantes, ajoutez plutôt un FormatCondition. Recourir à une boucle là où une règle s'imposait est la raison la plus fréquente des tickets « ma mise en couleur est fausse ».

Relire une couleur de police

Définir la couleur est facile ; la relire cache un piège. Si vous définissez avec .Color, relisez avec .Color ; si vous définissez avec .ColorIndex, relisez avec .ColorIndex. Relire la propriété que vous n'avez pas définie vous donne un nombre traduit, souvent surprenant :

ws.Range("A1").Font.Color = RGB(200, 0, 0)
Debug.Print ws.Range("A1").Font.Color        ' 13312  (le nombre 24 bits, = RGB 200,0,0)
Debug.Print ws.Range("A1").Font.ColorIndex   ' 3 ou une correspondance de palette proche - Excel approxime

.Color renvoie la valeur 24 bits exacte (à noter : elle est stockée en interne au format BGR, la décoder à la main est donc délicat — comparez-la à RGB(...) plutôt que de scruter l'entier). .ColorIndex sur une cellule colorée avec .Color renvoie la meilleure approximation de palette d'Excel, qui peut ne pas faire l'aller-retour. La règle reflète celle de l'écriture : restez dans un seul espace de nombres. Si votre code définit et vérifie les couleurs de police, choisissez .Color et utilisez-le des deux côtés.

Comment ExcelMaster aide

Le formatage de police paraît trivial jusqu'à ce que les détails s'accumulent : RGB face à ColorIndex, un nom de police qui se rabat en silence sur une autre, Characters qui ne fait rien sur une cellule de formule, et une boucle de coloration qui aurait dû être une règle de Mise en forme conditionnelle. Chacun échoue en silence — la mauvaise couleur, aucun changement, ou une mise en couleur qui se périme.

ExcelMaster vous laisse plutôt décrire le résultat. Dites « mets la ligne d'en-tête en gras et colore les négatifs en rouge » ou « surligne les lignes dont le statut est Overdue », et il écrit Font.Color = RGB(...) pour une passe statique ou un FormatCondition quand la couleur doit suivre les données — et applique la couleur à toute la plage d'un coup au lieu de boucler. Vous gardez le classeur et le code ; vous vous épargnez le moment où un 3 dans la mauvaise propriété peint tout dans la mauvaise teinte.

Questions fréquentes

Comment changer la couleur de police en VBA Excel ?

Utilisez Range("A1").Font.Color = RGB(red, green, blue), chaque valeur allant de 0 à 255 — par exemple RGB(200, 0, 0) pour du rouge. RGB couvre toutes les couleurs, définit exactement ce que vous indiquez et se relit de la même manière. N'utilisez Range("A1").Font.ColorIndex = n (un emplacement de palette de 1 à 56) que lorsque vous vous alignez sur un ancien classeur fondé sur une palette, et ne supposez jamais que les deux nombres désignent la même couleur.

Quelle est la différence entre Font.Color et Font.ColorIndex ?

.Color prend un nombre RGB 24 bits construit avec RGB(r, g, b), donnant accès aux 16 millions de couleurs. .ColorIndex prend un index dans la palette historique de 56 couleurs d'Excel. Le même entier ne signifie pas la même chose pour l'un et l'autre — .Color = 3 est un quasi-noir RGB(3,0,0), tandis que .ColorIndex = 3 est rouge. Préférez .Color pour définir, et relisez avec la propriété même qui a servi à définir.

Comment mettre une cellule en gras en VBA ?

Range("A1").Font.Bold = True, et False pour l'enlever. Bold, Italic et Strikethrough sont toutes des propriétés True/False de l'objet Font. Pour définir plusieurs propriétés de police à la fois, entourez-les d'un bloc With Range(...).Font ... End With afin de ne nommer la plage qu'une seule fois.

Comment colorer seulement une partie du texte d'une cellule ?

Utilisez Range("A1").Characters(Start:=1, Length:=4).Font.Bold = True pour mettre en forme une sous-chaîne. Cela ne fonctionne que si la cellule contient du texte saisi — sur une formule, un nombre ou une date, il n'y a aucun caractère modifiable et l'appel ne fait rien. Réservez-le aux libellés et aux notes, pas aux cellules que votre code va recalculer.

Pourquoi ma mise en couleur VBA cesse-t-elle d'être correcte quand je modifie la feuille ?

Parce qu'une boucle Font.Color peint un instantané ponctuel ; elle ne se relance pas quand les données changent. Pour une couleur qui doit suivre les valeurs — les négatifs en rouge, les lignes en retard surlignées — ajoutez une règle de Mise en forme conditionnelle avec Range(...).FormatConditions.Add, qu'Excel réévalue automatiquement. N'utilisez une boucle de coloration directe que pour un export statique que vous voulez figer.

Testé dans

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

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