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

VBA Color de celda en Excel — cómo poner el relleno de fondo desde código (y por qué el color no es dato)

|

VBA Color de celda en Excel — cómo poner el relleno de fondo desde código (y por qué el color no es dato)

TL;DR — El color de fondo de una celda vive en su objeto Interior: Range("A1").Interior.Color = RGB(255, 242, 204). Es la capa de relleno — la pintura detrás del texto — y como todo formato, cambia la apariencia, no el valor. Dos cosas pillan a todo el mundo. Primera: borrar un relleno es Interior.ColorIndex = xlNone, que no es lo mismo que pintarlo de blanco. Segunda, y más importante: el color no es dato. SUM y SUMIF no lo ven, así que un libro que usa el color de relleno para significar «aprobado» está guardando una categoría en un sitio que ninguna fórmula puede leer.

' Resalta toda la fila de encabezado con un relleno dorado suave.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sales")
ws.Range("A1:F1").Interior.Color = RGB(255, 242, 204)

' Quita un relleno del todo (vuelve a "No Fill", no a blanco).
ws.Range("A2:F2").Interior.ColorIndex = xlNone

Rellenar celdas con color es uno de los trabajos más automatizados de Excel, y comparte su modelo de color exactamente con la capa Font — la misma división entre Color y ColorIndex. Esta guía se centra en lo que es distinto del relleno: borrarlo correctamente, y la idea más grande de que una celda con color es decoración, no información. En cuanto eso hace clic, la pregunta de «cómo sumo las celdas amarillas» se responde sola — no las sumas, arreglas los datos.

Lo que aprenderás

  • El modelo mental — Interior es la capa de relleno, situada detrás del texto
  • Fijar el color de relleno con RGB, y borrarlo con xlNone (no con blanco)
  • La regla más importante — el color no lleva ningún dato, y ninguna fórmula puede leerlo
  • Resaltar por condición sin un bucle que se queda obsoleto
  • Rellenar rápido muchos rangos inconexos con Union
  • Leer de vuelta un color de relleno, y la trampa de xlNone

El modelo mental: Interior es la capa de relleno

Una celda tiene tres capas visuales, cada una alcanzada a través de su propio objeto: el texto (Font), el relleno que hay detrás (Interior), y cómo se muestra el número (NumberFormat). Interior es la del medio — la pintura de la pared detrás de la escritura. Su propiedad principal es Color, y usa el mismo modelo de color que Font: RGB(r, g, b) para cualquier color, o ColorIndex para la paleta heredada de 56 casillas.

Como comparte el modelo de color, aquí aplica la misma regla de la guía de fuentes: fija con .Color = RGB(...), y nunca confundas .Color con .ColorIndex. Interior.Color = 6 es un casi negro RGB(6,0,0); Interior.ColorIndex = 6 es amarillo. Quédate en un solo espacio numérico.

Borrar un relleno: xlNone no es blanco

Aquí está la primera trampa específica del relleno. Para quitar un fondo hay dos cosas que parecen iguales en pantalla pero no lo son:

ws.Range("A1").Interior.Color = RGB(255, 255, 255)   ' lo PINTA de blanco
ws.Range("A1").Interior.ColorIndex = xlNone          ' QUITA el relleno (No Fill)

En una hoja normal ambos se ven blancos, así que es fácil pensar que son equivalentes. No lo son. Un relleno blanco sigue siendo un relleno — oculta las líneas de cuadrícula, se imprime como un bloque blanco y responde Interior.Pattern = xlSolid. xlNone significa sin relleno en absoluto: las líneas de cuadrícula se ven a través, no se imprime nada y la celda está de verdad vacía de formato. Cuando restableces un rango — pongamos, borrar los resaltados de la ejecución anterior antes de aplicar otros nuevos — casi siempre quieres xlNone, no blanco. Pintar de blanco es un error que aparece más tarde, en una impresión o sobre una hoja con color, donde el bloque blanco de repente destaca.

La regla más importante: el color no es dato

Esta es la idea que separa un libro limpio de uno frágil. Un color de relleno no lleva ningún valor. Ninguna fórmula puede leerlo. SUM suma una celda amarilla igual que suma una blanca; SUMIF, COUNTIF e IF no tienen ningún operador para «está resaltada». Así que en cuanto usas el color para significar algo — las celdas doradas están aprobadas, las filas rojas están vencidas, el verde significa pagado — has guardado una categoría en un sitio que el motor de cálculo no puede ver.

' Si "approved" importa, va en un valor, no solo en un color.
ws.Range("H2").Value = "Approved"                    ' una formula puede leer esto
ws.Range("A2:H2").Interior.Color = RGB(198, 239, 206) ' el color es la consecuencia, no la fuente

La regla práctica: pon el significado en una celda, y deja que el color venga detrás. Añade una columna de estado, escribe «Approved» u «Overdue» en ella, y guía el relleno desde ahí (idealmente con Formato condicional, más abajo). Entonces COUNTIF(Status, "Overdue") funciona, los filtros funcionan, las tablas dinámicas funcionan — y el color es solo un eco visual de un valor que existe de verdad. La gente sí echa mano de «sumar por color» con .Interior.ColorIndex en un bucle, y se puede hacer, pero necesitarlo es casi siempre señal de que la categoría debería haber sido un valor real desde el principio.

Resaltar por condición: usa una regla, no un bucle obsoleto

Igual que con el color de fuente, guiar el color de relleno desde una condición con un bucle simple produce una instantánea puntual que se pudre en cuanto los datos cambian:

' Solo instantanea - hay que re-ejecutar tras cada edicion.
Dim c As Range
For Each c In ws.Range("B2:B1000")
    If c.Value < 0 Then c.Interior.Color = RGB(255, 199, 206)
Next c

Para un color que deba seguir valores en vivo, fija una regla de Formato condicional una vez y deja que Excel la vuelva a evaluar para siempre:

With ws.Range("B2:B1000").FormatConditions
    .Delete
    .Add(Type:=xlCellValue, Operator:=xlLess, Formula1:="0").Interior.Color = RGB(255, 199, 206)
End With

Reserva el bucle directo con Interior.Color para el resaltado estático — un informe puntual que estás a punto de congelar y exportar. Para cualquier cosa que deba seguir siendo correcta a medida que se edita la hoja, un FormatCondition es la herramienta adecuada. Esta es la misma decisión de criterio que en la capa de fuente, y vale la pena interiorizarla una vez: los bucles pintan instantáneas, las reglas se mantienen vivas.

Rellena muchos rangos rápido con Union

Fijar el relleno de un rango es instantáneo. Colorear cientos de celdas dispersas una a una en un bucle es lento, porque cada asignación es una ida y vuelta aparte a Excel. Reúne las celdas en un solo rango con Union y píntalas de una sola vez:

Dim target As Range, c As Range
For Each c In ws.Range("B2:B1000")
    If c.Value < 0 Then
        If target Is Nothing Then Set target = c Else Set target = Union(target, c)
    End If
Next c
If Not target Is Nothing Then target.Interior.Color = RGB(255, 199, 206)

El bucle sigue decidiendo qué celdas, pero la parte cara — aplicar de verdad el relleno — ocurre una vez para todo el Union en lugar de mil veces. (Para un bloque contiguo no necesitas Union en absoluto; simplemente colorea todo el Range en una sola instrucción.) La regla general en todas las capas de formato: decide en el bucle, aplica al rango.

Leer de vuelta un color de relleno

Leer Interior.Color devuelve el valor de 24 bits que fijaste (guardado internamente como BGR, así que compáralo contra un RGB(...) en vez de leer el entero en bruto). Lo único que hay que vigilar es el caso «sin relleno»:

Debug.Print ws.Range("A1").Interior.ColorIndex   ' -4142 (xlNone) cuando no hay relleno
Debug.Print ws.Range("A1").Interior.Color        ' 16777215 para un relleno blanco - parece "blanco", no "vacio"

Si necesitas saber si una celda está sin rellenar, comprueba Interior.ColorIndex = xlNone, no el valor Color — porque una celda explícitamente blanca devuelve un Color válido y engañaría a una comprobación basada en color. Este es el eco, del lado de la lectura, de la regla de antes de que «blanco no es xlNone».

Cómo ayuda ExcelMaster

Los rellenos de celda parecen sencillos hasta que asoman los casos límite: xlNone frente a blanco, un bucle de resaltado que debería haber sido una regla, el color usado como categoría que ninguna fórmula puede leer, y un bucle celda a celda que se arrastra. Cada uno de esos es un error silencioso — un resaltado obsoleto, un apaño de «sumar por color», una macro lenta.

ExcelMaster te deja describir el resultado. Di «resalta las filas vencidas» o «sombrea el encabezado y borra los colores del mes pasado», y escribe Interior.Color = RGB(...) para una pasada estática o un FormatCondition cuando el color deba seguir los datos, borra con xlNone en vez de pintar de blanco, y aplica al rango entero de una vez. Y cuando le pides «marca los pedidos aprobados», pone primero el estado en una columna real — así el color significa algo que una fórmula puede contar de verdad. Te quedas con el libro y con el código.

Preguntas frecuentes

¿Cómo pongo el color de fondo de una celda en Excel VBA?

Usa Range("A1").Interior.Color = RGB(red, green, blue) — por ejemplo RGB(255, 242, 204) para un dorado suave. Interior es el objeto de relleno y Color toma un valor RGB de 24 bits que cubre todos los colores. Usa Interior.ColorIndex = n (una casilla de paleta de 1 a 56) solo cuando igualas un libro antiguo basado en paleta, y no mezcles los dos espacios numéricos.

¿Cómo quito o borro el color de relleno de una celda en VBA?

Pon Range("A1").Interior.ColorIndex = xlNone. Esto quita el relleno del todo, así que las líneas de cuadrícula se ven a través y no se imprime nada. Poner Interior.Color = RGB(255,255,255) solo pinta la celda de blanco, que sigue siendo un relleno y se comporta distinto en las impresiones y sobre hojas con color. Para restablecer los resaltados, usa xlNone.

¿Puedo sumar o contar celdas por su color en VBA?

No con SUM, SUMIF ni COUNTIF — esas fórmulas no ven el color de relleno en absoluto. Puedes inspeccionar Interior.Color o Interior.ColorIndex celda a celda en un bucle de VBA, pero necesitarlo es señal de que la categoría debería ser un valor real. Pon «Approved» u «Overdue» en una columna de estado y cuenta eso en su lugar; deja que el color sea un eco visual del valor.

¿Por qué mi resaltado queda desfasado después de editar la hoja?

Porque un bucle For Each ... Interior.Color aplica una instantánea puntual; no se vuelve a ejecutar cuando cambian los valores. Para un color de relleno que deba seguir los datos, añade una regla de Formato condicional con Range(...).FormatConditions.Add, que Excel vuelve a evaluar automáticamente. Usa un bucle de relleno directo solo para un informe estático que pretendes congelar.

¿Cómo coloreo rápido muchas celdas dispersas en VBA?

Construye un solo Range con Union dentro de tu bucle, y luego fija .Interior.Color sobre ese rango combinado una sola vez, en lugar de colorear cada celda según la encuentras. Aplicar el relleno una vez a todo el Union evita una ida y vuelta aparte por celda. Para un bloque contiguo, sáltate Union y colorea todo el rango en una sola instrucción.

Probado en

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

Guías relacionadas: VBA Font · VBA NumberFormat · VBA Range · VBA With · VBA For Loop