TL;DR —
ColorIndexno es un color. Es un número de asiento — un índice de 1 a 56 dentro de una paleta que es propiedad del libro..Colornombra un color absoluto;.ColorIndexnombra 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(...); reservaColorIndexpara las dos cosas que.Colorno puede expresar —xlNone(sin relleno) yxlColorIndexAutomatic— 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 —
ColorIndexes un número de asiento en un teatro de 56 butacas, no un color - La regla que evita casi todos los colores equivocados —
.Colory.ColorIndexson espacios numéricos distintos - La trampa de la paleta — por qué un índice puede mostrarse diferente en otro libro
- Los dos valores especiales —
xlNoneyxlColorIndexAutomatic— que.Colorno puede expresar - Leer de vuelta un color, y por qué
.ColorIndexsobre una celda fijada con.Colorpierde información - Cuándo
ColorIndexsigue 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 = 10puede 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
xlNoneoxlColorIndexAutomatic— 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
