TL;DR —
Range.Fontes la capa de texto de una celda: color, negrita, cursiva, tamaño, nombre. Nada de eso cambia el valor que hay debajo — un número en rojo sigue siendo solo un número. El color es la parte que hace tropezar a todo el mundo, porque hay tres formas de fijarlo y dos de ellas viven en espacios numéricos distintos. UsaRange("A1").Font.Color = RGB(200, 0, 0)para cualquier color que quieras. UsaRange("A1").Font.ColorIndex = 3solo si trabajas con la vieja paleta de 56 casillas de Excel — y nunca mezcles las dos, porque.Color = 3y.ColorIndex = 3son rojos completamente distintos.
' Pon la fila de encabezado en negrita y azul oscuro - una instruccion por propiedad.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sales")
With ws.Range("A1:F1").Font
.Bold = True
.Color = RGB(0, 32, 96) ' RGB de 24 bits - lo que quieres el 95% de las veces
.Size = 12
End With
Cambiar el aspecto del texto es lo primero que casi todo el mundo automatiza en VBA, y es también
donde se esconde el error más confuso de todo el lenguaje — la diferencia entre .Color y
.ColorIndex. Esta guía se construye alrededor de una sola idea que vuelve obvio todo lo demás: el
objeto Font controla solo la apariencia, y su propiedad de color viene en dos variantes
incompatibles. Ten eso claro y la negrita, el tamaño, el nombre y el formato parcial encajan solos.
Lo que aprenderás
- El modelo mental —
Fontes la capa de texto, y nunca toca el valor - La regla más importante —
.Color(RGB) y.ColorIndex(paleta) son espacios numéricos distintos - Negrita, cursiva, tamaño y nombre — el resto de la capa de texto, fijados con
With - Dar formato a parte de una celda con
Characters, y cuándo no hace nada en silencio - Por qué colorear según el valor es cosa del Formato condicional, no de un bucle
- Leer de vuelta un color de fuente sin llevarte un número sorpresa
El modelo mental: Font es la capa de texto
Una celda tiene tres capas visuales que VBA alcanza a través de tres objetos distintos: el texto
(su Font), el relleno que hay detrás (su Interior), y cómo se
muestra el número (su NumberFormat). Esta guía trata la primera
capa. Cada propiedad bajo Range.Font — Color, Bold, Italic, Underline, Size, Name,
Strikethrough — cambia cómo se ven los caracteres y nada más.
Ese es todo el asunto, y vale la pena decirlo con claridad porque es la raíz de un malentendido
habitual: colorear el texto no lo etiqueta. Una celda cuya fuente pones en rojo sigue guardando
el mismo número, sigue alimentando las mismas fórmulas y es invisible para SUM, SUMIF e IF. El
color es para los ojos de una persona, no para el motor de cálculo de Excel. Si alguna vez te
descubres usando el color de fuente para significar algo — «las celdas rojas están vencidas» — pon
ese significado en un valor real, en algún sitio donde una fórmula pueda leerlo, y deja que el color
sea una consecuencia.
La regla más importante: Color y ColorIndex son espacios numéricos distintos
Esto es lo único que hay que llevarse. Hay dos propiedades de color en Font, y no hablan el mismo
idioma.
' .Color toma un valor RGB de 24 bits. Construyelo con RGB(red, green, blue), 0-255 cada uno.
ws.Range("A1").Font.Color = RGB(200, 0, 0) ' un rojo intenso
' .ColorIndex toma una casilla de paleta, 1 a 56, de la tabla de colores heredada de Excel.
ws.Range("A2").Font.ColorIndex = 3 ' tambien rojo - pero un rojo DISTINTO
Ambas líneas ponen el texto en rojo, así que parecen intercambiables. No lo son. .Color = 3 no te
daría el rojo de ColorIndex 3 — te daría RGB(3, 0, 0), un casi negro. El número 3 significa
«casilla de paleta 3» para ColorIndex y «el diminuto valor RGB 3» para Color. Darle a una
propiedad el número de la otra es el error número uno con las fuentes, y falla en silencio: sin
error, solo el color equivocado.
La regla es simple. Fija el color con .Color = RGB(r, g, b) — cubre los 16 millones de colores
y se lee exactamente como lo escribiste. Echa mano de .ColorIndex solo en dos situaciones: estás
igualando un libro existente basado en paleta, o quieres uno de los dos valores especiales que no
tienen equivalente RGB:
ws.Range("A1").Font.ColorIndex = xlColorIndexAutomatic ' vuelve al color automatico del tema
ws.Range("A1").Font.ColorIndex = xlColorIndexNone ' (solo en Interior, se ve mas adelante)
xlColorIndexAutomatic es realmente útil — restablece el color de fuente a «automático»
(normalmente negro, pero consciente del tema), algo que ningún valor RGB concreto expresa. Para
todo lo demás, .Color con RGB es la opción honesta.
Negrita, tamaño, nombre: el resto de la capa de texto
Las demás propiedades de la fuente son de un aburrimiento refrescante — son simples booleanos,
números y cadenas. Como normalmente fijas varias a la vez, With lo mantiene legible y evita volver
a resolver el rango cada vez (la misma razón que se ve en VBA With):
With ws.Range("B2:B50").Font
.Bold = True
.Italic = False
.Underline = xlUnderlineStyleSingle
.Size = 11 ' puntos
.Name = "Calibri"
.Color = RGB(0, 0, 0)
End With
Un par de cosas que conviene saber. .Bold, .Italic y .Strikethrough son True/False.
.Size va en puntos, no en píxeles. .Name es el tipo de letra como cadena, y si lo escribes mal o
nombras una fuente que no está instalada, Excel sustituye en silencio por una predeterminada en vez
de lanzar un error — así que un error de «no pasó nada» suele ser una errata en el nombre de la
fuente.
Dar formato a parte de una celda: Characters()
Todo lo anterior da formato a la celda entera. Para dar estilo a parte del texto — poner en negrita
la primera palabra, colorear un sufijo — usa Characters(start, length):
' Pon en negrita solo los primeros 4 caracteres de A1.
ws.Range("A1").Characters(Start:=1, Length:=4).Font.Bold = True
Esto es potente, pero tiene un límite duro que pilla a la gente: Characters solo funciona en una
celda que contiene una cadena literal. Si la celda contiene una fórmula, o un número, o una fecha,
no hay caracteres editables que direccionar y la llamada no hace nada (o da error). El formato
parcial es una propiedad del texto tecleado, no de los resultados calculados — así que es para
etiquetas y notas, no para celdas que tu código va a sobrescribir.
No uses un bucle para colorear según el valor — de eso se encarga el Formato condicional
Esta es la parte con opinión, y es la que más disgustos ahorra. La típica macro de principiante recorre un rango y colorea las celdas que cumplen una condición:
' Tentador, pero queda obsoleto en cuanto los datos cambian.
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
Funciona exactamente una vez. El color es una instantánea tomada cuando se ejecutó el bucle; edita un valor después y el formato ya está mal, porque nada lo vuelve a evaluar. El color guiado por el valor es justo para lo que existe el Formato condicional, y también puedes configurarlo desde VBA:
' Fija la REGLA una vez; Excel la mantiene correcta para siempre.
With ws.Range("B2:B1000").FormatConditions
.Delete
.Add(Type:=xlCellValue, Operator:=xlLess, Formula1:="0").Font.Color = RGB(200, 0, 0)
End With
Usa un bucle directo con Font.Color solo para un marcado estático y puntual — un informe que
estás a punto de exportar a PDF, una instantánea que quieres congelada. En cuanto el coloreado deba
seguir datos en vivo, añade un FormatCondition en su lugar. Echar mano de un bucle donde
correspondía una regla es la razón más habitual por la que existen los tickets de «mi resaltado está
mal».
Leer de vuelta un color de fuente
Fijar el color es fácil; leerlo de vuelta tiene una trampa. Si lo fijas con .Color, léelo con
.Color; si lo fijas con .ColorIndex, léelo con .ColorIndex. Leer la propiedad que no fijaste te
da un número traducido, a menudo sorprendente:
ws.Range("A1").Font.Color = RGB(200, 0, 0)
Debug.Print ws.Range("A1").Font.Color ' 13312 (el numero de 24 bits, = RGB 200,0,0)
Debug.Print ws.Range("A1").Font.ColorIndex ' 3 o una coincidencia de paleta cercana - Excel aproxima
.Color devuelve el valor exacto de 24 bits (ojo: internamente se guarda como BGR, así que
descodificarlo a mano es engorroso — compáralo contra RGB(...) en vez de mirar el entero a ojo).
.ColorIndex sobre una celda coloreada con .Color devuelve la conjetura de paleta más cercana de
Excel, que puede no volver igual. La regla refleja la de fijar: quédate en un solo espacio
numérico. Si tu código fija y comprueba colores de fuente, elige .Color y úsalo en ambos lados.
Cómo ayuda ExcelMaster
El formato de fuente parece trivial hasta que se acumulan los detalles: RGB frente a ColorIndex, un
nombre de fuente que cae en silencio a una predeterminada, un Characters que no hace nada en una
celda con fórmula, y un bucle de coloreado que tenía que haber sido una regla de Formato condicional.
Cada uno falla en silencio — el color equivocado, ningún cambio, o un resaltado que se queda
desfasado.
ExcelMaster te deja describir el
resultado en su lugar. Di «pon en negrita la fila de encabezado y colorea los negativos en rojo» o
«resalta las filas donde el estado sea Overdue», y escribe Font.Color = RGB(...) para una pasada
estática o un FormatCondition cuando el color deba seguir los datos — y fija el rango entero de una
vez en lugar de recorrerlo. Te quedas con el libro y con el código; te ahorras la parte en la que un
3 en la propiedad equivocada pinta todo del tono equivocado.
Preguntas frecuentes
¿Cómo cambio el color de fuente en Excel VBA?
Usa Range("A1").Font.Color = RGB(red, green, blue), con cada valor de 0 a 255 — por ejemplo
RGB(200, 0, 0) para el rojo. RGB cubre todos los colores, fija exactamente lo que especificas y
se lee de vuelta igual. Usa Range("A1").Font.ColorIndex = n (una casilla de paleta de 1 a 56) solo
cuando estás igualando un libro antiguo basado en paleta, y nunca supongas que los dos números
significan el mismo color.
¿Cuál es la diferencia entre Font.Color y Font.ColorIndex?
.Color toma un número RGB de 24 bits construido con RGB(r, g, b), que da acceso a los 16 millones
de colores. .ColorIndex toma un índice de la paleta heredada de 56 colores de Excel. El mismo
entero significa cosas distintas para cada uno — .Color = 3 es un casi negro RGB(3,0,0), mientras
que .ColorIndex = 3 es rojo. Prefiere .Color para fijar, y léelo de vuelta con la misma propiedad
con la que fijaste.
¿Cómo pongo una celda en negrita en VBA?
Range("A1").Font.Bold = True, y False para quitarla. Bold, Italic y Strikethrough son todas
propiedades True/False del objeto Font. Para fijar varias propiedades de fuente a la vez,
envuélvelas en un bloque With Range(...).Font ... End With para nombrar el rango una sola vez.
¿Cómo coloreo solo parte del texto de una celda?
Usa Range("A1").Characters(Start:=1, Length:=4).Font.Bold = True para dar estilo a una subcadena.
Esto solo funciona cuando la celda contiene texto tecleado — en una fórmula, número o fecha no hay
caracteres editables y la llamada no hace nada. Úsalo para etiquetas y notas, no para celdas que tu
código va a recalcular.
¿Por qué mi coloreado en VBA deja de ser correcto cuando edito la hoja?
Porque un bucle con Font.Color pinta una instantánea puntual; no se vuelve a ejecutar cuando cambian
los datos. Para un color que deba seguir los valores — negativos en rojo, filas vencidas resaltadas —
añade una regla de Formato condicional con Range(...).FormatConditions.Add, que Excel vuelve a
evaluar automáticamente. Usa un bucle de coloreado directo solo para una exportación estática que
quieras congelar.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 11/08/2026.
Guías relacionadas: VBA Color de celda · VBA NumberFormat · VBA With · VBA Range · VBA For Loop
