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

VBA RGB en Excel — cómo un color se convierte en número (y la trampa del BGR)

|

VBA RGB en Excel — cómo un color se convierte en número (y la trampa del BGR)

TL;DR — El .Color de 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: RGB lo construye como rojo abajo, azul arriba (r + g*256 + b*65536), que es lo contrario de un hex de la web. Así que pegar #4472C4 tal cual como .Color = &H4472C4 intercambia el rojo y el azul y te da el color equivocado. Construye siempre los colores con RGB(...), 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 — .Color es un número, y RGB es 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