TL;DR —
CurrentRegiones el bloque contiguo de celdas alrededor de una celda. Excel empieza en tu celda y se expande hacia afuera hasta topar con una fila totalmente en blanco y una columna totalmente en blanco, y devuelve el rectángulo más pequeño que encierra esa isla ininterrumpida — lo mismo que seleccionaCtrl+Mayús+*. Tú no calculas los bordes; Excel los encuentra. La trampa: una sola fila o columna totalmente en blanco es un muro que parte el bloque sin avisar, así que puedes obtener la mitad de tus datos sin ningún error. También incluye la fila de encabezado — quítala conOffsetyResize.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Data")
Dim block As Range
Set block = ws.Range("A1").CurrentRegion ' toda la tabla alrededor de A1, encabezado incluido
' Solo los datos - baja mas alla del encabezado y encoge la altura en uno:
Dim body As Range
Set body = block.Offset(1, 0).Resize(block.Rows.Count - 1, block.Columns.Count)
CurrentRegion es el antídoto a codificar a mano "A1:D100". En vez de calcular dónde terminan los
datos, le pides a Excel que te entregue el bloque que ya puede ver. Esta guía se construye sobre la
única idea que la vuelve fiable: CurrentRegion la definen los bordes en blanco, así que es tan
fiable como limpios estén tus datos. Ten eso claro y tanto su potencia (una línea toma la tabla)
como su modo de fallo (una fila en blanco la parte por la mitad) salen de la misma regla.
Lo que aprenderás
- El modelo mental — Excel se expande desde tu celda hasta los bordes en blanco
- La regla más importante — una fila o columna totalmente en blanco es un muro
- Por qué
CurrentRegionincluye el encabezado, y cómo quitarlo - En qué se diferencia de
UsedRangey deEnd(xlUp) - Tomar el bloque una vez, desde cualquier celda de su interior
- Cuándo fiarte de
CurrentRegion— y cuándo usar en su lugar una Tabla de verdad
El modelo mental: Excel se expande hasta los bordes en blanco
CurrentRegion responde «¿cuál es el bloque de datos alrededor de esta celda?». Excel comienza en
la celda que nombras y hace crecer el rectángulo hacia afuera en todas las direcciones, deteniéndose
solo cuando una fila entera y una columna entera de celdas en blanco lo cierran:
' Si A1:D101 es una tabla solida rodeada de celdas vacias, esto es A1:D101:
Set block = ws.Range("A1").CurrentRegion
Es la versión en código de hacer clic dentro de una tabla y pulsar Ctrl+Mayús+* (o Ctrl+A una
vez) — Excel selecciona la isla sobre la que estás. La consecuencia clave es que los límites se
descubren, no se declaran: nunca escribes la última fila ni la última columna, así que la
referencia se ajusta sola a datos que crecieron o encogieron desde la última vez que miraste. Ese es
todo el atractivo, y la siguiente regla es su precio.
La regla más importante: una fila o columna en blanco es un muro
Como el bloque está delimitado por el vacío, una sola fila o columna totalmente en blanco lo
detiene en seco. Una fila vacía en medio de tus datos y CurrentRegion devuelve solo la parte de
encima — sin avisar, sin ningún error:
' Filas 1-50 con datos, fila 51 totalmente en blanco, filas 52-100 con datos:
Set block = ws.Range("A1").CurrentRegion ' devuelve solo A1:D50 - la mitad inferior se pierde
Lo contrario también muerde: un valor perdido a un hueco de distancia se arrastra dentro, hinchando
la región más allá de tus datos reales. Lo que no lo rompe es una sola celda vacía dentro del
bloque — que falte un valor en una fila no es problema; solo una fila o columna entera en blanco
actúa como muro. Así que CurrentRegion es exactamente lo correcto para tablas limpias y sólidas, y
exactamente lo incorrecto para hojas con huecos de subtotales, filas separadoras o columnas
separadoras en blanco. Cuando el bloque vuelve del tamaño equivocado, busca huecos interiores antes
de sospechar de nada más.
CurrentRegion incluye el encabezado — cómo quitarlo
CurrentRegion devuelve la fila de encabezado junto con los datos, que es la razón número uno de
que un bucle «procesara el título como un registro». Para obtener el cuerpo de datos, pasa de la
primera fila y acorta la altura en uno — la pareja exacta de Offset + Resize del resto de este
grupo:
Dim block As Range: Set block = ws.Range("A1").CurrentRegion
Dim body As Range
Set body = block.Offset(1, 0).Resize(block.Rows.Count - 1, block.Columns.Count)
' body ahora excluye el encabezado; recorrelo o leelo como una matriz.
Offset(1, 0) desliza la referencia entera una fila hacia abajo; luego
Resize recorta la altura en uno para que no se derrame más allá del fondo.
Esta es la recompensa del grupo: CurrentRegion detecta el bloque, y Offset y Resize tallan la
parte que de verdad quieres.
CurrentRegion frente a UsedRange frente a End(xlUp)
Tres herramientas dicen «encontrar los datos», y elegir mal es una fuente habitual de rangos demasiado grandes o demasiado pequeños:
CurrentRegion— el bloque contiguo alrededor de una celda. Normalmente lo que quieres: sigue la isla real de datos e ignora los valores sueltos lejanos (mientras haya un hueco en blanco).UsedRange— todo lo que Excel cree que se ha tocado, incluidas las celdas con formato pero vacías y las celdas a las que borraste el valor sin restablecerlas. Habitualmente infla el resultado, devolviendo un rango mucho mayor que tus datos (ver VBA UsedRange).End(xlUp)/ última fila — encuentra un solo borde, el fondo de una columna. Úsalo cuando todo lo que necesitas es el número de filas (ver VBA Última fila); usaCurrentRegioncuando quieres todo el rectángulo en una sola llamada.
Regla general: echa mano de CurrentRegion para tomar el bloque, de End(xlUp) para medir una
dimensión, y evita apoyarte en UsedRange para la extensión de los datos porque miente después de
las ediciones.
Tómalo una vez, desde cualquier celda del bloque
CurrentRegion funciona desde cualquier celda del interior de la isla, no solo desde la
superior izquierda — por eso ActiveCell.CurrentRegion toma la tabla en la que esté parado el
usuario:
Set block = ActiveCell.CurrentRegion ' la tabla alrededor de donde este el cursor
Además, se reevalúa cada vez que lo llamas, así que guárdalo una vez y reutiliza la variable en
lugar de llamar a .CurrentRegion repetidamente:
Dim block As Range: Set block = ws.Range("A1").CurrentRegion
Debug.Print block.Rows.Count, block.Columns.Count ' reutiliza block, no lo vuelvas a detectar
Si la hoja cambia después de capturarlo, vuelve a leerlo — la variable es una instantánea del bloque tal como estaba cuando lo llamaste, no una referencia viva que crece por sí sola.
Cuándo fiarte — y cuándo usar una Tabla
CurrentRegion es la opción por defecto correcta para «actúa sobre la tabla que está aquí», pero
solo cuando tus datos tienen bordes limpios: sin filas ni columnas en blanco interiores, sin
valores sueltos a un hueco de distancia. En hojas hechas para personas — huecos de subtotales, filas
separadoras entre secciones, columnas en blanco por estética — devolverá sin avisar el rectángulo
equivocado. Cuando tu diseño tenga eso, no lo disimules con detección de celdas en blanco; dale a
los datos una forma de verdad. Convierte el bloque en una Tabla de Excel (ListObject), cuyo
.DataBodyRange lo define la estructura, no dónde caigan los huecos, y que crece automáticamente
a medida que se añaden filas. Como en VBA Range, la forma debe vivir en los
datos — CurrentRegion lee una forma que los datos limpios ya tienen; una Tabla la garantiza.
Cómo ayuda ExcelMaster
CurrentRegion mete varios fallos silenciosos en una sola llamada cómoda: una fila en blanco que
parte el bloque por la mitad, una fila de encabezado arrastrada dentro de los datos, un valor suelto
que hincha el rango, y la elección entre él, UsedRange y End(xlUp) que decide si obtienes de más
o de menos. Ninguno de ellos lanza un error — simplemente procesas las celdas equivocadas.
ExcelMaster te deja
describir el resultado en su lugar. Di «lee la tabla de datos de esta hoja, sin el encabezado», y
toma el bloque, comprueba si hay huecos interiores que la truncarían, quita el encabezado con
Offset y Resize, y te devuelve el cuerpo — o sugiere una Tabla de verdad cuando el diseño tiene
huecos que CurrentRegion no puede sobrevivir. Te quedas con el libro y con el código; te ahorras
la ejecución en la que la mitad de las filas desaparecieron sin avisar.
Preguntas frecuentes
¿Qué es CurrentRegion en Excel VBA?
CurrentRegion es el bloque contiguo de celdas alrededor de una celda dada — el rectángulo hasta el
que Excel se expande hasta encontrar una fila totalmente en blanco y una columna totalmente en
blanco. Range("A1").CurrentRegion devuelve todo ese bloque, encabezado incluido. Es el equivalente
en código de pulsar Ctrl+Mayús+* dentro de una tabla, y te permite referirte a los datos sin
calcular la última fila ni columna.
¿Por qué CurrentRegion se detiene en una fila en blanco?
Porque el bloque está delimitado por el vacío. Una fila o columna totalmente en blanco actúa
como muro, así que Excel deja de expandirse ahí y devuelve solo la parte de tu lado del hueco — sin
avisar, sin ningún error. Una sola celda vacía dentro de una fila no lo rompe; solo lo hace una
fila o columna entera en blanco. Quita las filas y columnas en blanco interiores si quieres que
CurrentRegion capture toda la tabla.
¿Cuál es la diferencia entre CurrentRegion y UsedRange?
CurrentRegion es el bloque contiguo alrededor de una celda concreta y sigue tus datos reales.
UsedRange es todo lo que Excel cree que se ha usado en la hoja, incluidas las celdas con formato
pero vacías y las celdas borradas sin restablecer — a menudo infla el resultado y devuelve un rango
mayor que los datos. Usa CurrentRegion (o una Tabla) para obtener el bloque de datos verdadero;
trata UsedRange como un límite superior, no como una extensión exacta.
¿Cómo excluyo la fila de encabezado de CurrentRegion?
Desplaza el bloque una fila hacia abajo y redimensiona su altura en uno menos:
block.Offset(1, 0).Resize(block.Rows.Count - 1, block.Columns.Count). Offset(1, 0) mueve la
referencia más allá del encabezado, y Resize recorta la última fila para que el resultado no se
derrame por debajo de los datos. Protege el caso en que el bloque es solo una fila de encabezado, que
daría un Resize de cero filas.
¿Puedo usar CurrentRegion desde cualquier celda de la tabla?
Sí. CurrentRegion funciona desde cualquier celda del interior del bloque contiguo, no solo desde
la superior izquierda, así que ActiveCell.CurrentRegion devuelve la tabla en la que está el
cursor. Se reevalúa cada vez que lo llamas, así que guarda el resultado en una variable y
reutilízalo en lugar de llamar a .CurrentRegion repetidamente, y vuelve a leerlo si la hoja cambia.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 15/08/2026.
Guías relacionadas: VBA Resize · VBA Offset · VBA Cells · VBA UsedRange · VBA Última fila
