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

VBA ColorIndex en Excel — la paleta de 56 colores y por qué tu color sale mal

|

VBA ColorIndex en Excel — la paleta de 56 colores y por qué tu color sale mal

TL;DRColorIndex no es un color. Es un número de asiento — un índice de 1 a 56 dentro de una paleta que es propiedad del libro. .Color nombra un color absoluto; .ColorIndex nombra una casilla, y quién se sienta en esa casilla puede cambiar de un libro a otro. Por eso el mismo índice se ve dorado en tu máquina y mostaza en la de un colega. Para código nuevo, fija un color absoluto con .Color = RGB(...); reserva ColorIndex para las dos cosas que .Color no puede expresar — xlNone (sin relleno) y xlColorIndexAutomatic — y para igualar un libro antiguo basado en paleta.

' Dos espacios numericos distintos. No los mezcles.
Range("A1").Interior.ColorIndex = 6           ' casilla 6 de la paleta -> amarillo (normalmente)
Range("A2").Interior.Color = RGB(255, 255, 0) ' un color absoluto -> amarillo, siempre

' Los dos especiales que solo ColorIndex puede expresar:
Range("A3").Interior.ColorIndex = xlNone                 ' quita el relleno por completo
Range("A4").Font.ColorIndex = xlColorIndexAutomatic      ' que Excel decida (texto negro)

Cada objeto que lleva color en Excel — un relleno de celda (Interior), la Font, los Borders, una serie de gráfico — expone ambas propiedades: una Color y una ColorIndex. Apuntan al mismo píxel pero a través de dos sistemas numéricos completamente distintos, y confundirlos es el error de «¿por qué mi color sale mal?» más común de todo VBA. Esta guía va de la más antigua de las dos — el índice de paleta — porque entender lo que realmente es explica toda una clase de problemas de colores que se ven diferentes.

Lo que aprenderás

  • El modelo mental — ColorIndex es un número de asiento en un teatro de 56 butacas, no un color
  • La regla que evita casi todos los colores equivocados — .Color y .ColorIndex son espacios numéricos distintos
  • La trampa de la paleta — por qué un índice puede mostrarse diferente en otro libro
  • Los dos valores especiales — xlNone y xlColorIndexAutomatic — que .Color no puede expresar
  • Leer de vuelta un color, y por qué .ColorIndex sobre una celda fijada con .Color pierde información
  • Cuándo ColorIndex sigue siendo la herramienta correcta, y cuándo prefieres .Color

El modelo mental: un número de asiento, no un color

Imagina un teatro con 56 butacas numeradas. ColorIndex = 6 no significa «amarillo». Significa «quien esté sentado en la butaca 6». En un libro por defecto la butaca 6 resulta que tiene amarillo, así que parece que el amarillo viene de fábrica. Pero el plano de butacas — la paleta de colores del libro — pertenece al libro, y se puede reasignar. Mete otro color en la butaca 6 y todas las celdas que pusiste en ColorIndex = 6 cambian de golpe, sin que tu código toque nada.

.Color, en cambio, no es un número de asiento en absoluto. Interior.Color = RGB(255, 255, 0) escribe el color real dentro de la celda. No hay búsqueda, ni plano, nada que reasignar. Esa diferencia — casilla frente a valor absoluto — es toda la historia, y es la razón por la que las dos propiedades se comportan de forma tan distinta cuando un libro pasa de una máquina o un tema a otro.

La regla que más importa: dos espacios numéricos, nunca mezclados

Este es el fallo que produce la mayoría de los colores equivocados. .Color y .ColorIndex aceptan números de rangos totalmente distintos, y un número que es válido para uno es también válido — y significa otra cosa — para el otro:

Range("A1").Interior.Color = 6        ' Espacio Color: 6 = RGB(6,0,0) -> casi negro
Range("A1").Interior.ColorIndex = 6   ' Espacio Index: casilla 6 -> amarillo

Nadie quiere decir «casi negro» al teclear 6, pero .Color = 6 da exactamente eso, en silencio. El arreglo es una disciplina, no un truco: decide en qué espacio estás y quédate ahí. Si la línea dice .Color, el lado derecho es un valor RGB(...) o una constante vb*. Si dice .ColorIndex, el lado derecho es un entero de 1 a 56 (o un valor especial de más abajo). Leer un valor de .Color en una propiedad ColorIndex, o al revés, siempre es un error aunque compile y se ejecute.

La trampa de la paleta: por qué el índice se muestra diferente en otro sitio

Este es el coste real del modelo de número de asiento. Como ColorIndex es una búsqueda en ActiveWorkbook.Colors(n), el color que produce es tan estable como esa paleta. Dos cosas mueven las butacas:

  • Un libro creado a partir de una plantilla con la paleta personalizada ya tiene colores distintos en algunas casillas. Tu ColorIndex = 10 puede ser verde bosque en tu archivo y un oliva turbio en el suyo.
  • El código puede reescribir la paleta directamente (ActiveWorkbook.Colors(10) = RGB(...)), y los colores de tema modernos añaden otra capa de reasignación por encima.

Así que una macro que rellena los encabezados de un informe con ColorIndex = 37 se ve perfecta en la máquina donde se escribió y sutilmente mal en la del cliente — mismo código, mismo índice, otro plano de butacas. .Color = RGB(...) no tiene este modo de fallo, porque nunca le pregunta nada a la paleta. Cuando un color tiene que verse idéntico en todas partes, ese es el argumento que decide: el color absoluto viaja, un índice de paleta no.

Los dos especiales: xlNone y xlColorIndexAutomatic

Hay un trabajo que solo ColorIndex puede hacer, y es la razón honesta para conservarlo. .Color puede expresar cualquiera de los 16 millones de colores — pero no puede expresar «ningún color». Dos constantes negativas llenan ese hueco:

Range("A1").Interior.ColorIndex = xlNone                ' -4142: sin relleno alguno (las lineas de cuadricula se ven a traves)
Range("A1").Font.ColorIndex = xlColorIndexAutomatic     ' -4105: automatico (negro sobre blanco, segun el tema)

xlNone es la forma correcta de quitar un relleno — de verdad vacío, no pintado de blanco (un relleno blanco sigue siendo un relleno; consulta VBA Color de celda). xlColorIndexAutomatic es el valor por defecto de la fuente: significa «cualquiera que sea el color automático de Excel», que sigue el tema y cambia con sensatez sobre fondos oscuros, donde un RGB(0,0,0) grabado a fuego no lo haría. Ninguno tiene equivalente en .Color, así que este es el único sitio donde ColorIndex no es solo lastre heredado — es la única herramienta para el trabajo.

Leer de vuelta un color: ColorIndex pierde información

La lectura es donde los dos espacios te muerden por segunda vez. Si una celda se rellenó con un color absoluto, pedir su ColorIndex no te devuelve una respuesta limpia — Excel devuelve la casilla de paleta más cercana, que tira a la basura el color exacto:

Range("A1").Interior.Color = RGB(200, 215, 240)   ' un azul suave concreto
Debug.Print Range("A1").Interior.ColorIndex        ' un numero de casilla cercano - NO tu color
Debug.Print Range("A1").Interior.Color             ' el valor exacto de 24 bits que fijaste

La regla para leer es el espejo de la regla para escribir: lee de vuelta con la misma propiedad con la que escribiste. Si fijaste .Color, compara .Color (contra un RGB(...), ya que se guarda en BGR — consulta VBA RGB). Comprueba .ColorIndex solo cuando te importa concretamente la casilla — por ejemplo, If .Interior.ColorIndex = xlNone para detectar una celda sin rellenar, que es la única lectura donde ColorIndex es exactamente lo correcto.

Cuándo ColorIndex sigue siendo la herramienta correcta

No es «evítalo siempre». Echa mano de ColorIndex cuando:

  • Necesitas xlNone o xlColorIndexAutomatic — no hay otra forma de decirlos.
  • Estás igualando un libro que se construyó sobre la paleta de 56 colores y quieres que tus rellenos se muevan con su esquema a propósito.
  • Estás leyendo una celda solo para preguntar «¿rellenada o no?» (= xlNone).

Para todo lo demás — un informe que debe verse igual para cada lector, un color de marca, cualquier cosa que vayas a comparar más tarde — fija .Color = RGB(...). El criterio es sencillo una vez que el modelo está claro: un número de asiento es cómodo dentro de un teatro y no significa nada fuera de él. El color absoluto es lo predeterminado; el índice de paleta es una elección deliberada y estrecha.

Cómo ayuda ExcelMaster

La división entre Color y ColorIndex es justo esa clase de detalle que compila, se ejecuta y luego produce un color que no querías — un 6 leído como casi negro, un encabezado que cambia de tono en la copia del cliente, una lectura de ColorIndex que redondea tu color a una casilla de paleta sin decir nada. Nada de eso da error; solo se ve mal más tarde.

ExcelMaster te deja describir el color que quieres — «rellena el encabezado de azul oscuro», «borra los resaltados de la ejecución anterior», «usa nuestro verde de marca» — y escribe .Color = RGB(...) para colores absolutos que se ven igual en todas partes, ColorIndex = xlNone cuando quieres decir quita el relleno, y xlColorIndexAutomatic para una fuente que deba seguir el tema. Se queda en un solo espacio numérico por línea, así que el bug de «¿por qué mi color sale raro?» nunca llega a producción. Te quedas con el libro y con el código.

Preguntas frecuentes

¿Cuál es la diferencia entre Color y ColorIndex en VBA?

.Color es un valor absoluto de 24 bits — Interior.Color = RGB(255,255,0) es amarillo en cualquier máquina. .ColorIndex es un número de casilla de 1 a 56 dentro de la paleta del libro; Interior.ColorIndex = 6 es «el color que haya en la casilla 6», que una paleta personalizada o un tema pueden cambiar. Usan rangos numéricos distintos, así que nunca asignes el valor de uno al otro — .Color = 6 es casi negro, no la casilla 6.

¿Por qué el mismo ColorIndex se ve diferente en otro libro?

Porque ColorIndex es una búsqueda en la paleta de ese libro (ActiveWorkbook.Colors), y la paleta puede diferir entre archivos — una plantilla puede personalizarla, o los colores de tema pueden reasignarla. El índice es estable pero el color que hay detrás no lo es. Si un color debe verse idéntico para todos, fija un .Color = RGB(...) absoluto en su lugar, que nunca consulta la paleta.

¿Cómo quito el relleno de una celda con ColorIndex?

Pon Range("A1").Interior.ColorIndex = xlNone. Eso quita el relleno por completo, así que las líneas de cuadrícula se ven a través y no se imprime nada — a diferencia de Interior.Color = RGB(255,255,255), que pinta la celda de blanco y sigue siendo un relleno. xlNone (valor -4142) es uno de los dos trabajos que .Color no puede hacer, y por eso vale la pena conservar ColorIndex para él.

¿Qué es xlColorIndexAutomatic?

xlColorIndexAutomatic (valor -4105) es el color «automático» — para Font.ColorIndex significa el color de texto por defecto que sigue el tema de Excel, normalmente negro sobre fondo claro y adaptándose sobre los oscuros. Es el valor por defecto seguro para el color de fuente, porque un RGB(0,0,0) grabado a fuego no puede adaptarse. No hay equivalente en .Color, así que lo fijas a través de ColorIndex.

¿Debo usar ColorIndex o RGB para código VBA nuevo?

Prefiere .Color = RGB(...) para código nuevo: es un color absoluto que se ve igual en cualquier libro y en cualquier máquina, y cubre los 16 millones de colores en lugar de 56 casillas. Reserva ColorIndex para los especiales xlNone y xlColorIndexAutomatic, para igualar un libro construido a propósito sobre la paleta heredada, y para la lectura de «¿está rellenada esta celda?» (= xlNone).

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 08/09/2026.

Guías relacionadas: VBA RGB · VBA Formato condicional · VBA Color de celda · VBA Font · VBA Borders