TL;DR — El
.Colorde una celda no es un nombre de color; es un solo número.RGB(r, g, b)es la función que empaqueta tres canales (cada uno de 0 a 255) en ese número. La pega está en el orden:RGBlo construye como rojo abajo, azul arriba (r + g*256 + b*65536), que es lo contrario de un hex de la web. Así que pegar#4472C4tal cual como.Color = &H4472C4intercambia el rojo y el azul y te da el color equivocado. Construye siempre los colores conRGB(...), y si tienes que usar hex, recuerda que los bytes van al revés.
' RGB empaqueta tres canales en un solo Long:
Range("A1").Interior.Color = RGB(68, 114, 196) ' un azul concreto, correcto en cualquier maquina
' El hex web #4472C4 es el MISMO azul - pero NO lo pegues en crudo:
Range("A2").Interior.Color = &H4472C4 ' MAL: esto es #C47244 (rojo y azul intercambiados)
Range("A3").Interior.Color = RGB(&H44, &H72, &HC4) ' BIEN: separa el hex en canales
Cada propiedad de color en Excel VBA — relleno de celda (Interior),
Font, Borders, color de pestaña, serie de gráfico — toma la
misma clase de valor: un número de 24 bits. RGB es cómo lo construyes, y entender lo que ese número es
explica toda una familia de bugs del tipo «el color se parece pero está mal», sobre todo cuando hay de por
medio un código hex de una web o de una guía de marca.
Lo que aprenderás
- El modelo mental —
.Colores un número, yRGBes el empaquetador - La trampa que pilla a todo el mundo — el número se guarda en
BGR, al revés del hex web - Las constantes de color
vb*, y lo que revelan sobre el orden de bytes - Leer de vuelta un color y separarlo en rojo, verde y azul
- Por qué el modelo de color es idéntico en rellenos, fuentes, bordes y gráficos
- El criterio — define tu paleta una sola vez como constantes con nombre
El modelo mental: un número, tres canales
Un color en pantalla son tres mandos: cuánto rojo, cuánto verde, cuánto azul, cada uno de 0 a 255.
RGB(r, g, b) toma esos tres mandos y los pliega en un solo entero (un Long) que Excel guarda en el
objeto. RGB(0,0,0) es negro (todos los mandos a cero), RGB(255,255,255) es blanco (todos al máximo),
RGB(255,0,0) es rojo puro. No hay nada misterioso en el color — la sorpresa está por completo en cómo se
empaquetan los tres mandos en un solo número, y ahí es donde vive el bug.
La regla que más importa: el número es BGR, no RGB
Esta es la fórmula que RGB usa de verdad:
RGB(r, g, b) = r + g * 256 + b * 65536
Léela con cuidado: el rojo es el byte más bajo, el azul el más alto. En hexadecimal el valor guardado
es &HBBGGRR, no &HRRGGBB. Un color web como #4472C4 significa rojo 44, verde 72, azul C4 en
orden RGB — pero Excel lo guarda en orden BGR. Así que en cuanto pegas un hex web directo en .Color,
has intercambiado los canales rojo y azul:
Range("A1").Interior.Color = &H4472C4 ' Excel lo lee en BGR: R=C4, G=72, B=44 -> un rojo anaranjado
Eso no es un error de redondeo; es un color completamente distinto, y es la razón número uno por la que un
color de marca «se ve mal en la macro» cuando quedaba bien en el CSS. El arreglo fiable es no darle nunca a
Excel un hex empaquetado — dale los tres canales y deja que RGB los empaquete:
Range("A1").Interior.Color = RGB(&H44, &H72, &HC4) ' correcto: los canales quedan en los diales correctos
Si de verdad tienes que guardar un literal, inviértelo a &HC47244. Pero separar el hex en RGB(...) es
más claro e imposible de invertir por error, así que ese es el hábito que vale la pena crear.
Las constantes vb, y lo que demuestran
VBA trae un puñado de constantes de color con nombre. Son cómodas para los primarios, y confirman calladamente el orden de bytes:
Debug.Print vbRed ' 255 = RGB(255, 0, 0) -> el rojo es el byte bajo
Debug.Print vbGreen ' 65280 = RGB(0, 255, 0)
Debug.Print vbBlue ' 16711680 = RGB(0, 0, 255) -> el azul es el byte alto
vbRed = 255 es la pista: si el rojo fuera el byte alto, el rojo puro sería 16711680. Solo existen ocho
de estas constantes (vbBlack, vbWhite, vbRed, vbGreen, vbBlue, vbYellow, vbMagenta,
vbCyan), así que valen para un primario rápido pero no sustituyen a una paleta de verdad. Para cualquier
cosa de marca, escríbelo con RGB(...).
Leer de vuelta un color y separarlo
Leer .Color te da el Long empaquetado. Para sacar los tres canales, invierte el empaquetado — el rojo
es el resto, el azul es lo de arriba:
Dim c As Long: c = Range("A1").Interior.Color
Dim r As Long, g As Long, b As Long
r = c Mod 256
g = (c \ 256) Mod 256
b = c \ 65536
Debug.Print r, g, b ' los tres canales originales
La conclusión práctica para las comparaciones: nunca compares un .Color guardado contra un literal hex en
crudo que hayas tecleado — compáralo contra RGB(...), que empaqueta igual que lo hizo Excel. Probar
If .Interior.Color = RGB(68,114,196) es correcto; If .Interior.Color = &H4472C4 es el bug del BGR al
revés.
Un solo modelo de color, en todas partes
La recompensa de aprender esto una vez es que es el mismo número en cualquier sitio donde aparezca un
color. El mismo valor RGB(...) funciona en:
ws.Range("A1").Interior.Color = RGB(68, 114, 196) ' relleno
ws.Range("A1").Font.Color = RGB(255, 255, 255) ' texto
ws.Range("A1").Borders.Color = RGB(0, 0, 0) ' lineas de borde
ws.Tab.Color = RGB(68, 114, 196) ' pestana de la hoja
No hay un formato de color por objeto que reaprender. Relleno, fuente, borde, pestaña, serie de gráfico —
todos toman el mismo Long de 24 bits. Por eso compensa acertar el empaquetado una vez: el arreglo y el
hábito se transfieren a cada cosa con color del modelo de objetos. (La antigua propiedad ColorIndex es la
excepción — una casilla de paleta, no este número; consulta VBA ColorIndex.)
El criterio: pon nombre a tu paleta una sola vez
Desparramar RGB(255, 242, 204) por cien líneas es la forma en que un informe acaba con tres «dorados»
ligeramente distintos. Define la paleta una vez, arriba del módulo, como constantes con nombre — entonces el color
tiene un nombre, vive en un solo sitio y se cambia sin esfuerzo:
Private Const CLR_HEADER As Long = 4759559 ' RGB(68,114,196) empaquetado una vez
Private Const CLR_WARN As Long = 13551615 ' RGB(255,199,206)
O mantenlos como RGB(...) dentro de un pequeño ayudante. Sea como sea, la regla es la misma que rige las
constantes en general: un valor que significa algo debería tener un nombre, no
reescribirse. Construye con RGB, guarda en un solo sitio, y la trampa del BGR nunca puede morderte
porque nunca escribes un hex empaquetado a mano.
Cómo ayuda ExcelMaster
La inversión del BGR es un bug genuinamente feo porque el código es válido y el color simplemente está
mal — un azul de marca que sale naranja, una comparación que nunca coincide porque prueba un hex en crudo
contra un valor BGR. Cuesta una tarde justamente porque nada da error.
ExcelMaster te deja dar un color tal como
lo tienes de verdad — «usa #4472C4», «que sea nuestro verde de marca», «255, 242, 204» — y escribe
RGB(...) con los canales en los diales correctos, nunca un hex con los bytes al revés. Pídele «resalta
las celdas que coincidan con el color del encabezado» y compara contra RGB(...), no contra un literal en
crudo, así que la coincidencia funciona de verdad. Cuando reutilizas un color, lo sube a una constante con
nombre. Te quedas con el libro y con el código, menos la tarde de los canales intercambiados.
Preguntas frecuentes
¿Cómo funciona la función RGB en VBA?
RGB(red, green, blue) toma tres canales, cada uno de 0 a 255, y devuelve un solo número Long que Excel
usa como color: RGB(255, 242, 204) es un dorado suave. Internamente calcula red + green*256 + blue*65536, así que el número es un color de 24 bits que puedes asignar a cualquier propiedad de color —
Interior.Color, Font.Color, Borders.Color, etcétera.
¿Por qué mi color sale mal cuando uso un código hex en VBA?
Porque Excel guarda los colores en orden BGR (azul en el byte alto, rojo en el bajo), que es lo contrario
de un hex web como #RRGGBB. Asignar .Color = &H4472C4 lo lee como BGR e intercambia el rojo y el
azul. Separa el hex en canales en su lugar — .Color = RGB(&H44, &H72, &HC4) — o invierte el literal a
&HC47244.
¿Cómo convierto un color hex a RGB en VBA?
Separa el hex en sus tres pares de bytes y pásalos a RGB: para #4472C4, escribe
RGB(&H44, &H72, &HC4). Esto mantiene cada canal en el dial correcto y evita la trampa del orden de bytes
BGR que te encuentras si asignas el hex empaquetado directamente a .Color.
¿Cómo recupero los valores de rojo, verde y azul de un color?
Lee el Long empaquetado desde .Color y luego descomponlo: r = c Mod 256, g = (c \ 256) Mod 256,
b = c \ 65536. Como Excel guarda el valor en BGR, el rojo es el byte bajo y el azul el byte alto — esto
invierte exactamente lo que RGB empaquetó.
¿Qué son las constantes de color vb en VBA?
VBA ofrece ocho constantes con nombre — vbBlack, vbWhite, vbRed, vbGreen, vbBlue, vbYellow,
vbMagenta, vbCyan — cada una igual a un valor RGB(...) (vbRed = 255 = RGB(255,0,0)). Son cómodas
para los primarios, pero para cualquier color concreto o de marca usa RGB(r, g, b) para controlar los
tres canales.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 08/09/2026.
Guías relacionadas: VBA ColorIndex · VBA Color de celda · VBA Font · VBA Formato condicional · VBA Const
