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

VBA Group Rows en Excel — agrupa filas en un esquema plegable sin que el botón acabe en la fila equivocada

|

VBA Group Rows en Excel — agrupa filas en un esquema plegable sin que el botón acabe en la fila equivocada

TL;DRRows("2:5").Group no 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 con ShowLevels, nunca poniendo .Hidden tú 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 .Hidden tú mismo
  • Cómo anidar .Group profundiza el nivel del esquema, y por qué reejecutar tu macro sobreagrupa
  • Ungroup frente a ClearOutline — 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