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

VBA Font en Excel — cómo dar color, negrita y tamaño desde código (y la trampa de ColorIndex)

|

VBA Font en Excel — cómo dar color, negrita y tamaño desde código (y la trampa de ColorIndex)

TL;DRRange.Font es 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. Usa Range("A1").Font.Color = RGB(200, 0, 0) para cualquier color que quieras. Usa Range("A1").Font.ColorIndex = 3 solo si trabajas con la vieja paleta de 56 casillas de Excel — y nunca mezcles las dos, porque .Color = 3 y .ColorIndex = 3 son 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 — Font es 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.FontColor, 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