TL;DR —
Rows("2:5").Groupno oculta esas filas ni las elimina. Añade una banda a un esquema (outline) plegable —las filas siguen ahí, solo que plegables detrás de un botón+/−en el margen—. Agrupar es un pliegue, no un ocultamiento. Dos cosas hacen tropezar a todo el mundo: el botón de colapso cae por defecto en la fila debajo del grupo (Outline.SummaryRow), y debes colapsar por nivel conShowLevels, nunca poniendo.Hiddentú mismo.
Sub GroupDetailRows()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Report")
ws.Cells.ClearOutline ' borra cualquier esquema anterior, para que al reejecutar quede plano
ws.Outline.SummaryRow = xlSummaryAbove ' pon el boton +/- en la fila de totales ARRIBA del detalle
ws.Rows("3:7").Group ' pliega las filas 3-7 bajo el total de la fila 2
ws.Outline.ShowLevels RowLevels:=1 ' colapsa al nivel superior desde el codigo, no con .Hidden
End Sub
Agrupar filas, agrupar columnas y el propio objeto Outline son un mismo sistema con tres disfraces:
.Group añade una banda, el esquema colapsa y expande por nivel, y un único ajuste de hoja decide en
qué lado cae el botón de colapso. Domina agrupar filas —el pliegue, el nivel, el lado del resumen— y
agrupar columnas es la misma idea girada noventa grados, gobernada por el mismo
objeto Outline.
Lo que aprenderás
- El modelo mental — agrupar es un pliegue, no un ocultamiento ni un borrado
- La trampa de SummaryRow — por qué el botón
+/−cae debajo de tu grupo, y cómo moverlo - Por qué colapsas por nivel con
ShowLevels, nunca poniendo.Hiddentú mismo - Cómo anidar
.Groupprofundiza el nivel del esquema, y por qué reejecutar tu macro sobreagrupa Ungroupfrente aClearOutline— quita una banda, o borra el esquema entero
El modelo mental: agrupar es un pliegue, no un ocultamiento
Rows("2:5").Group no significa «oculta las filas 2 a 5». Significa «haz que las filas 2 a 5 sean
plegables». Excel dibuja una barra de esquema en el margen izquierdo con un botón −; haz clic y las
filas se colapsan fuera de la vista; haz clic en el + y vuelven. Las filas nunca estuvieron ocultas en el
sentido de .Hidden = True —las gestiona un esquema que sabe plegarlas y desplegarlas a demanda—.
Esta distinción es todo el artículo. Un ocultamiento es un estado de un solo sentido que tienes que
acordarte de deshacer. Un pliegue es una vista reversible que Excel rastrea por ti, organizada en niveles,
con botones que el lector puede pulsar. Todo lo que sorprende a la gente sobre agrupar —dónde aparece el
botón, por qué .Hidden y el esquema no coinciden, por qué reejecutar la macro entierra los datos tres
niveles más hondo— se deriva de que agrupar es un pliegue con estructura, no un ocultamiento a lo bruto.
La trampa de SummaryRow: en qué lado cae el botón
Agrupa las filas 2 a 5 y el botón de colapso no aparece sobre el grupo —aparece en la fila 6, la fila
justo debajo—. Eso ocurre porque Worksheet.Outline.SummaryRow toma por defecto xlSummaryBelow: Excel
asume que tu subtotal o total está debajo del detalle que resume, así que aparca el botón ahí.
Ese valor por defecto es correcto para un bloque clásico de «detalle y luego total». Es incorrecto —y es la queja número uno sobre agrupar— cuando tu total está encima del detalle, como ocurre en la mayoría de los paneles:
ws.Outline.SummaryRow = xlSummaryAbove ' el boton se ata al total ENCIMA del grupo
ws.Rows("3:7").Group ' el total es la fila 2, el detalle son las filas 3-7
Déjalo al revés y el botón se desprende del número que todo el mundo lee de verdad: tu total está en la
fila 2, pero el + queda abajo en la fila 8, flotando bajo la última fila de detalle. SummaryRow es un
ajuste de hoja completa —decídelo una vez, antes de construir el esquema, para que encaje con dónde
viven tus totales—. Cambiarlo después reordena los botones de toda la hoja, pero convertirlo en un primer
paso deliberado es más limpio que llevarte una sorpresa.
Colapsa por nivel, no con .Hidden
La forma tentadora de colapsar un grupo en código es ocultar las filas:
ws.Rows("3:7").Hidden = True ' MAL - un ocultamiento manual que el esquema no rastrea
No lo hagas. Eso establece un ocultamiento del que el esquema no sabe nada, así que los botones +/− y
el estado real de las filas se van separando —el botón dice expandido mientras las filas están ocultas, o
al revés—. Colapsa a través del esquema en su lugar, y Excel mantiene todo consistente:
ws.Outline.ShowLevels RowLevels:=1 ' muestra solo el nivel superior - todo lo demas se pliega
ws.Outline.ShowLevels RowLevels:=2 ' muestra dos niveles de profundidad - expande una capa mas
ShowLevels lleva a toda la hoja a un nivel del esquema en una sola llamada, y los botones se mantienen
fieles a la realidad. Si necesitas expandir o colapsar un único nodo en vez de un nivel completo, usa
ShowDetail sobre su fila de resumen —tratado junto con el resto del
objeto Outline—.
Niveles: anidar grupos, y por qué reejecutar sobreagrupa
Agrupa un rango, luego agrupa un subrango dentro de él, y no has hecho dos grupos planos —has hecho un esquema anidado, un nivel más hondo—:
ws.Rows("2:20").Group ' nivel 1 - la seccion completa
ws.Rows("5:9").Group ' nivel 2 - un subbloque dentro de ella
Un esquema llega hasta 8 niveles de profundidad, lo cual es potente para una jerarquía real y una
trampa cuando ocurre por accidente. El accidente es reejecutar tu macro: .Group sobre filas que ya
están agrupadas añade otra banda encima, así que la segunda ejecución te deja en el nivel 2, la tercera
en el nivel 3, con los datos enterrados más hondo cada vez. Agrupar no es idempotente.
El arreglo es la misma disciplina que cualquier rutina de «créalo si no está» —reinicia antes de reconstruir—:
ws.Cells.ClearOutline ' quita el esquema entero, y luego construye de cero
ws.Rows("3:7").Group
Borra primero, agrupa después, y la macro produce el mismo esquema tanto si se ejecuta una vez como diez.
Ungroup frente a ClearOutline
Hay dos formas de deshacer un agrupamiento, y no son del mismo tamaño:
ws.Rows("3:7").Ungroup ' quita UNA banda / un nivel de ese rango
ws.Cells.ClearOutline ' quita TODO el esquema de la hoja, en una sola llamada
Ungroup es la herramienta de precisión —pela un nivel de un rango—. ClearOutline es el mazo —borra todo
el esquema y empieza limpio—. El error es recorrer Ungroup en un bucle para borrarlo todo: es más lento,
es delicado acertar con los rangos, y es exactamente lo que ClearOutline hace en una sola instrucción.
Ninguno de los dos borra una sola fila de datos —quitan el pliegue, no las filas—.
Cómo te ayuda ExcelMaster
Agrupar filas es una línea que esconde tres decisiones —en qué lado va el botón de colapso para tu
diseño, si colapsas por nivel o se te cuela en .Hidden, y si reejecutar entierra tus datos un nivel más
hondo cada vez en silencio— y equivocarte en cualquiera de ellas falla sin ningún error: un botón que se
aleja flotando de su total, botones de esquema que mienten sobre el estado real de las filas, o un informe
plegado tres niveles de más.
ExcelMaster te deja decir lo que
quieres —«agrupa las filas de detalle bajo cada total, colapsadas al nivel superior, botón en la fila de
totales»— y ajusta SummaryRow para que encaje con tu diseño, borra el esquema anterior para que al
reejecutar quede plano, agrupa las filas correctas, y colapsa con ShowLevels en vez de .Hidden. Tú
conservas el libro y el código.
Preguntas frecuentes
¿Cómo agrupo filas en VBA?
Llama a .Group sobre filas enteras: Rows("3:7").Group pliega las filas 3 a 7 en una banda del esquema
con un botón de colapso en el margen izquierdo. Cualifica la hoja —
ThisWorkbook.Worksheets("Report").Rows("3:7").Group— para que no dependa de cuál sea la hoja activa. Las
filas no se ocultan ni se eliminan; se vuelven plegables.
¿Por qué el botón de colapso de mi grupo está debajo de mis filas en vez de encima?
Porque Worksheet.Outline.SummaryRow toma por defecto xlSummaryBelow, que asume que tu total está debajo
del detalle. Si tu total está encima de las filas de detalle, pon
ws.Outline.SummaryRow = xlSummaryAbove antes de agrupar para que el botón +/− se ate a la fila de
totales que todo el mundo lee.
¿Cómo colapso o expando filas agrupadas en VBA?
Usa los niveles del esquema: ws.Outline.ShowLevels RowLevels:=1 colapsa al nivel superior, y números más
altos expanden más capas. No pongas .Hidden = True en las filas tú mismo —eso es un ocultamiento manual
que el esquema no rastrea, así que los botones y el estado real de las filas se desincronizan—.
¿Por qué mi macro sigue añadiendo más grupos cada vez que se ejecuta?
Porque .Group sobre filas ya agrupadas añade otro nivel encima —agrupar no es idempotente—. Llama a
ws.Cells.ClearOutline al principio para borrar cualquier esquema existente, y luego agrupa de cero, para
que el resultado sea el mismo tanto si la macro se ejecuta una vez como diez.
¿Cuál es la diferencia entre Ungroup y ClearOutline?
Ungroup quita una banda o un nivel de un rango concreto; ClearOutline quita todo el esquema de la hoja
en una sola llamada. Para deshacer un grupo usa Rows("3:7").Ungroup; para borrarlo todo usa
ws.Cells.ClearOutline en vez de recorrer Ungroup en un bucle. Ninguno borra datos —quitan el pliegue—.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 16/09/2026.
Guías relacionadas: VBA Group Columns · VBA Outline · VBA Hide Columns · VBA Insert Rows · VBA Delete Rows
