TL;DR —
Unionpega rectángulos dispersos en una sola referencia para que puedas actuar sobre varios bloques no adyacentes a la vez. Es la versión en código de hacer Ctrl+clic en varias áreas. La regla más importante:Unionconcatena, no elimina duplicados — las celdas solapadas se cuentan dos veces, así que es una lista por lotes, no una unión de conjuntos matemática. Su forma más útil es el patrón de acumulación, que reúne celdas en un bucle y actúa sobre ellas una sola vez:
Dim flagged As Range, c As Range
For Each c In ThisWorkbook.Worksheets("Data").Range("B2:B1000")
If c.Value < 0 Then
If flagged Is Nothing Then Set flagged = c Else Set flagged = Union(flagged, c)
End If
Next c
If Not flagged Is Nothing Then flagged.Interior.Color = vbRed ' da color a todas las coincidencias en una sola llamada
Hasta ahora cada referencia ha contenido un rectángulo. Union rompe ese límite: una sola
variable de rango puede contener ahora B2, D5:D9 y F1 a la vez, y una única línea les da
color, las borra o las copia las tres. Donde SpecialCells deja que Excel elija por ti un
conjunto no contiguo, Union te deja construir uno a propósito. Esta guía se construye sobre una
sola idea — Union es cómo reúnes un lote sobre el que operar una vez, no una forma de calcular
un conjunto sin duplicados. Ten eso claro y tanto la sorpresa del .Count como el error de
Nothing cobran sentido.
Lo que aprenderás
- El modelo mental —
Unioncombina rangos no adyacentes en una sola referencia (Ctrl+clic en código) - La regla más importante — concatena, no elimina duplicados, así que los solapamientos cuentan doble
- El patrón de acumulación —
If Is Nothing ... Else Uniony por qué evita un error en tiempo de ejecución - Operaciones por lotes — da color, borra o copia muchos bloques en una sola llamada en vez de un bucle
- Los límites — al menos dos argumentos, nada de
Nothing, todas las áreas en la misma hoja - En qué se diferencia
Union(∪, combinar) de Intersect (∩, solapar)
El modelo mental: Union combina rangos no adyacentes en una sola referencia
Union toma dos o más rangos y devuelve un único rango que cubre todos ellos:
Dim multi As Range
Set multi = Union(Range("A1:A3"), Range("C1:C3"), Range("E1"))
multi.Interior.Color = vbYellow ' tres bloques separados, resaltados juntos
Esa referencia se comporta como cualquier otro rango en la mayoría de las operaciones — un solo
.Interior.Color, un solo .ClearContents, un solo .Copy toca cada bloque. Piensa en
seleccionar celdas a mano manteniendo pulsado Ctrl: haces clic en A1:A3, luego en C1:C3, luego
en E1, y ahora se mueven como un grupo. Union es ese Ctrl+clic expresado en código, y es la única
forma de entregar una única selección no adyacente a una sola operación.
La regla más importante: Union concatena, no elimina duplicados
Aquí es donde el nombre confunde a la gente. En teoría de conjuntos, una «unión» elimina los
duplicados. El Union de VBA no. Cose las áreas tal cual, así que las celdas que aparecen en
más de un argumento se cuentan dos veces:
Dim u As Range
Set u = Union(Range("A1:A5"), Range("A3:A8"))
Debug.Print u.Count ' imprime 11 (5 + 6), NO 8 - A3:A5 contada dos veces
El solapamiento A3:A5 se incluye desde ambos argumentos, así que .Count informa de 11 para lo que
en realidad son solo 8 celdas distintas. Esto es inofensivo cuando operas sobre la referencia —
poner un color en la misma celda dos veces no hace nada malo — pero es un bug de verdad si haces
.Count del resultado, lo sumas o lo pasas a algún sitio que da por hecho celdas distintas. La
lección: usa Union para reunir celdas sobre las que actuar, nunca para calcular cuántas celdas
distintas tienes. Si de verdad necesitas un conjunto sin duplicados, filtra los datos con un
AutoFilter en su lugar.
El patrón de acumulación: construir una referencia en un bucle
El uso más valioso de Union es reunir coincidencias durante un bucle y actuar sobre ellas una
sola vez al final. Pero hay una trampa: Union exige al menos dos rangos reales y rechaza
Nothing, así que Union(rngAll, c) falla en la primera iteración, cuando rngAll aún está
vacío. El modismo estándar protege la primera celda:
Dim rngAll As Range, c As Range
For Each c In Range("A2:A1000")
If Len(Trim(c.Value)) = 0 Then ' la condicion que sea que uses
If rngAll Is Nothing Then
Set rngAll = c ' primera coincidencia: siembrala directamente
Else
Set rngAll = Union(rngAll, c) ' coincidencias posteriores: extiende la referencia
End If
End If
Next c
If Not rngAll Is Nothing Then rngAll.EntireRow.Delete ' un solo borrado para todas las coincidencias
Lee la guarda así: siembra la referencia con la primera coincidencia y luego sigue uniendo el
resto encima. Saltarse la rama If rngAll Is Nothing es el error número uno con Union — pasar
Nothing como argumento lanza un error en tiempo de ejecución en cuanto el bucle encuentra su
primera coincidencia.
Operaciones por lotes: una sola llamada en vez de un bucle celda a celda
¿Para qué molestarse en reunir una referencia, en vez de actuar sobre cada celda según la
encuentras? Velocidad. Tocar la hoja una vez por celda es la razón número uno de que las macros
vayan a paso de tortuga. Reúne las celdas con Union y luego ejecuta una sola operación sobre
todo el grupo — decide en el bucle, aplica al rango:
' Lento: escribe en la hoja en cada fila que coincide
For Each c In rng
If c.Value > 100 Then c.Interior.Color = vbGreen ' un toque a la hoja por coincidencia
Next c
' Rapido: reune primero, da color una vez
For Each c In rng
If c.Value > 100 Then _
Set hot = IIf(hot Is Nothing, c, Union(hot, c))
Next c
If Not hot Is Nothing Then hot.Interior.Color = vbGreen ' un unico toque a la hoja
Es la misma disciplina que la guía de color de celda recomienda para resaltar: reúne los objetivos, aplica el formato una vez. Con miles de filas, la diferencia es de segundos frente a milisegundos.
Los límites: dos argumentos, nada de Nothing, la misma hoja
Tres restricciones pillan a la gente, y las tres se dicen rápido:
- Al menos dos rangos.
Unionnecesita dos o más argumentos y ninguno puede serNothing— de ahí la guarda de acumulación de arriba. - La misma hoja. Todos los rangos que unes tienen que vivir en la misma hoja. Combinar
rangos de dos hojas lanza
error 1004; si necesitas trabajo entre hojas, procesa por separado la unión de cada hoja. - El resultado es de múltiples áreas. Como SpecialCells, una unión
es una referencia no contigua. Recorre
For Each area In u.Areasen un bucle cuando necesites cada bloque contiguo, y recuerda que.Countsuma todas las celdas de todas las áreas (contando dos veces los solapamientos).
Union frente a Intersect: combinar frente a solapar
Union e Intersect son los dos operadores de conjuntos sobre rangos, y
son opuestos. Union(A, B) devuelve todo lo que está en cualquiera de A o B — la huella
combinada. Intersect(A, B) devuelve solo lo que está en ambos — el solapamiento, o Nothing
si no se tocan. Union hace crecer una referencia; Intersect la encoge a la parte compartida. Echa
mano de Union para reunir celdas dispersas en un lote, y de Intersect para comprobar o
restringir — sobre todo para preguntar «¿editó el usuario una celda dentro del rango que me
importa?».
Cómo ayuda ExcelMaster
Union es engañosamente simple: la guarda de acumulación es fácil de olvidar en la primera
iteración, el doble recuento de .Count corrompe en silencio cualquier total, y lo de «solo la
misma hoja» aparece como un 1004 que no esperabas. Ninguno de estos se manifiesta hasta la
entrada exacta que los dispara.
ExcelMaster te deja describir el
resultado en su lugar. Di «resalta cada fila donde el saldo sea negativo» o «borra todas las filas
en blanco de la columna A», y escribe el bucle, siembra la referencia con la primera coincidencia,
la extiende con Union y ejecuta una sola operación sobre todo el grupo — la versión rápida y
protegida, sin el fallo por Nothing ni la lentitud celda a celda. Te quedas con el libro y con el
código; te ahorras la pasada en la que el bucle tocó la hoja diez mil veces.
Preguntas frecuentes
¿Qué hace el método Union en Excel VBA?
Union combina dos o más rangos en una única referencia que los cubre todos, incluso cuando no
están uno al lado del otro. Luego puedes dar color, borrar, copiar o eliminar cada bloque en una
sola operación. Es el equivalente en código de hacer Ctrl+clic en varias áreas de una hoja para que
actúen como una sola selección.
¿Union en VBA elimina las celdas duplicadas?
No. Union concatena los rangos sin eliminar duplicados, así que una celda que aparece en más de un
argumento se cuenta dos veces. Union(Range("A1:A5"), Range("A3:A8")).Count devuelve 11, no 8.
Esto es inofensivo cuando operas sobre la referencia, pero está mal si la cuentas o la sumas — usa
Union para reunir celdas sobre las que actuar, no para calcular un conjunto sin duplicados.
¿Por qué Union lanza un error dentro de un bucle?
Porque Union exige al menos dos rangos reales y rechaza Nothing. En la primera iteración tu
variable acumuladora aún es Nothing, así que Union(rngAll, c) falla. Protégelo:
If rngAll Is Nothing Then Set rngAll = c Else Set rngAll = Union(rngAll, c) — siembra con la
primera coincidencia y luego une el resto.
¿Puede Union combinar rangos de hojas distintas?
No. Todos los rangos que pasas a Union tienen que estar en la misma hoja; mezclar hojas lanza
error 1004. Si necesitas trabajar entre varias hojas, construye y procesa una unión aparte para
cada hoja.
¿Cuál es la diferencia entre Union e Intersect en VBA?
Son operaciones de conjuntos opuestas sobre rangos. Union devuelve todo lo que está en
cualquiera de los rangos — el área combinada. Intersect devuelve solo lo que está en
ambos — el solapamiento, o Nothing si no se tocan. Usa Union para reunir celdas dispersas
en un lote, e Intersect para comprobar si un rango cae dentro de otro.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 16/08/2026.
Guías relacionadas: VBA Intersect · VBA SpecialCells · VBA Range · VBA Color de celda · VBA Bucle For
