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

VBA Union en Excel — combinar rangos no adyacentes en una sola referencia (y por qué no elimina duplicados)

|

VBA Union en Excel — combinar rangos no adyacentes en una sola referencia (y por qué no elimina duplicados)

TL;DRUnion pega 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: Union concatena, 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 — Union combina 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 Union y 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. Union necesita dos o más argumentos y ninguno puede ser Nothing — 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.Areas en un bucle cuando necesites cada bloque contiguo, y recuerda que .Count suma 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