TL;DR — El esquema (outline) es el objeto sobre el que se construye cada grupo. Una vez que existe, manejas toda la hoja a través de él:
ws.Outline.ShowLevels RowLevels:=2, ColumnLevels:=1colapsa o expande cada grupo a un nivel en una sola llamada —mucho mejor que recorrer.Hiddenen un bucle—. Excel también puede construir el esquema por ti:AutoOutlinelee tus fórmulas de resumen, ySubtotalinserta los totales, los grupos y el esquema todo de una vez.
Sub CollapseToTotals()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Report")
ws.Outline.ShowLevels RowLevels:=2, ColumnLevels:=1 ' los dos ejes a un nivel en una sola llamada
End Sub
Agrupar filas y agrupar columnas añaden bandas a este objeto. Aprender a manejar el esquema directamente
—colapsar por nivel, dejar que Excel lo autoconstruya a partir de fórmulas, generarlo con subtotales, y
reiniciarlo limpiamente— es lo que convierte un montón de llamadas a .Group en un informe que puedes
plegar, desplegar y reconstruir a demanda.
Lo que aprenderás
ShowLevels— colapsa o expande toda la hoja a un nivel, los dos ejes en una sola llamadaAutoOutline— deja que Excel construya el esquema a partir de tus fórmulas, y por qué falla sin ellasSubtotal— crea totales, grupos y esquema a la vez, y la trampa de reejecutar que los apilaShowDetail— expande o colapsa un único nodo en vez de un nivel enteroClearOutlinefrente aRemoveSubtotal— quita el pliegue, o quita el pliegue y las filas insertadas
ShowLevels: colapsa toda la hoja por nivel
El esquema organiza los grupos en niveles —el nivel 1 es el más colapsado (solo totales), números más
altos muestran más detalle—. ShowLevels fija la hoja a un nivel directamente, sin tocar ni un solo
.Hidden:
ws.Outline.ShowLevels RowLevels:=1 ' filas: muestra solo el nivel superior (totales)
ws.Outline.ShowLevels RowLevels:=3 ' filas: expande a tres niveles de profundidad
ws.Outline.ShowLevels RowLevels:=2, ColumnLevels:=1 ' fija los dos ejes a la vez
Filas y columnas son ejes independientes, así que puedes pasar uno y dejar el otro intacto. Dos cosas que
vale la pena saber: ShowLevels sin argumentos no hace nada —tienes que pasar al menos un eje— y un nivel
más alto que el grupo más profundo simplemente expande ese eje por completo, no da error. Esta es la
herramienta que reemplaza cualquier bucle artesanal de .Hidden = True/False, y mantiene honestos los
botones del esquema.
AutoOutline: deja que Excel lo construya — si tus fórmulas se lo ganan
AutoOutline construye un esquema automáticamente leyendo tus fórmulas. Si la columna N totaliza las
columnas B a M con =SUM(B2:M2), y una fila de subtotal suma las filas de encima, Excel infiere la
estructura y dibuja los grupos por ti:
ws.UsedRange.AutoOutline ' infiere los grupos a partir de las formulas de resumen
La trampa —y la razón por la que la gente la da por rota— es que no es magia. AutoOutline necesita
fórmulas de resumen consistentes para leer. Apúntala a un bloque plano de valores sin estructura
SUM/SUBTOTAL y falla con el error en tiempo de ejecución 1004, «Cannot create an outline»:
On Error Resume Next
ws.UsedRange.AutoOutline
If Err.Number <> 0 Then MsgBox "No summary formulas to outline" ' esperado en datos sin estructura
On Error GoTo 0
Así que AutoOutline es la decisión correcta en un informe estructurado con fórmulas y la decisión
equivocada en un volcado de datos plano. Cuando los datos todavía no tienen totales, la herramienta que los
añade es Subtotal.
Subtotal: totales, grupos y esquema en una sola llamada
Range.Subtotal es la función que hace todo el trabajo de una vez —inserta filas de subtotal con fórmulas
SUBTOTAL(9, ...) en cada cambio de una columna clave, agrupa el detalle debajo de ellas, y construye el
esquema sobre el conjunto—:
ws.Range("A1:D200").Subtotal _
GroupBy:=1, _ ' subtotal en cada cambio de la columna 1
Function:=xlSum, _
TotalList:=Array(4) ' suma la columna 4
El bug número uno de Subtotal es reejecutarlo. Una segunda llamada no reemplaza la primera —apila un
nuevo conjunto de subtotales dentro de los existentes, anidando el esquema un nivel más hondo cada vez,
exactamente igual que reejecutar .Group—. Quítalos antes de reconstruir:
ws.Range("A1:D200").RemoveSubtotal ' quita primero las filas insertadas Y el esquema
ws.Range("A1:D200").Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(4)
' - o bien - pasa Replace:=True para sobrescribir un conjunto existente en una sola llamada
ShowDetail: expande o colapsa un único nodo
ShowLevels mueve toda la hoja; ShowDetail mueve un solo grupo. Fíjalo en una fila o columna de resumen
para expandir o colapsar solo ese nodo:
ws.Rows(6).ShowDetail = True ' expande el grupo cuyo resumen es la fila 6
ws.Rows(6).ShowDetail = False ' colapsa solo ese grupo
Usa ShowLevels cuando quieras una vista uniforme de todo el informe, y ShowDetail cuando quieras abrir
una sola sección —un bloque mensual, un departamento— mientras el resto se queda plegado.
ClearOutline frente a RemoveSubtotal
Existen dos reinicios, y la diferencia está en qué se llevan consigo:
ClearOutlinequita el pliegue y nada más. Las filas, las filas de subtotal, las fórmulas —todo se queda—; solo desaparece la estructura de agrupamiento.ws.Cells.ClearOutlinelo borra en toda la hoja.RemoveSubtotalquita el pliegue y las filas de subtotal insertadas, devolviendo el rango a los datos en bruto con los que empezaste.
Elige según tu intención. Si quieres conservar los totales pero perder la capacidad de plegar,
ClearOutline. Si quieres recuperar los datos exactamente como estaban antes de subtotalizarlos,
RemoveSubtotal. Recurrir a ClearOutline cuando pretendías deshacer un subtotal deja las filas de total
insertadas varadas en tus datos, sin ningún esquema que las organice.
Cómo te ayuda ExcelMaster
El esquema es un objeto pequeño con cuatro verbos fáciles de confundir —ShowLevels mueve toda la hoja,
ShowDetail mueve un solo nodo, AutoOutline solo funciona cuando hay fórmulas que lo respalden, y
Subtotal se apila en silencio en una reejecución a menos que quites antes— y elegir el equivocado falla
sin ningún error: un AutoOutline que lanza el 1004 sobre datos planos, subtotales duplicados anidados un
nivel de más, o un ClearOutline que arranca el pliegue pero deja varadas las filas de total.
ExcelMaster te deja decir lo que
quieres —«subtotaliza las ventas por región, colapsa a los totales, y no los dupliques si lo vuelvo a
ejecutar»— y quita los subtotales anteriores antes de reconstruir, colapsa con ShowLevels, usa
AutoOutline solo donde las fórmulas lo respaldan, y elige entre ClearOutline o RemoveSubtotal según
si quieres conservar los totales. Tú conservas el libro y el código.
Preguntas frecuentes
¿Cómo colapso o expando un esquema en VBA?
Usa ShowLevels: ws.Outline.ShowLevels RowLevels:=1 colapsa las filas al nivel superior (solo totales),
y números más altos expanden más detalle. Añade ColumnLevels para manejar el eje de columnas en la misma
llamada. Fija toda la hoja de una vez y mantiene sincronizados los botones del esquema, a diferencia de
fijar .Hidden a mano.
¿Por qué AutoOutline da el error 1004, «Cannot create an outline»?
Porque AutoOutline construye el esquema leyendo tus fórmulas de resumen, y no hay ninguna que leer —el
rango son valores planos sin estructura SUM/SUBTOTAL—. Añade fórmulas de resumen o subtotales primero,
o usa Range.Subtotal para insertarlos. AutoOutline es para informes estructurados con fórmulas, no para
volcados de datos en bruto.
¿Por qué mis subtotales se duplican cuando ejecuto la macro dos veces?
Porque Subtotal apila un nuevo conjunto dentro del existente en vez de reemplazarlo. Llama a
Range.RemoveSubtotal antes de volver a subtotalizar, o pasa Replace:=True en la llamada a Subtotal,
para que cada ejecución produzca un conjunto limpio en vez de anidarlos un nivel más hondo.
¿Cuál es la diferencia entre ClearOutline y RemoveSubtotal?
ClearOutline quita solo la estructura de agrupamiento y deja cada fila —incluidas las filas de subtotal—
en su sitio. RemoveSubtotal quita el esquema y las filas de subtotal insertadas, devolviendo el rango a
los datos originales. Usa ClearOutline para perder solo la capacidad de plegar, RemoveSubtotal para
deshacer un subtotal por completo.
¿Cómo expando solo un grupo en vez de todo el esquema?
Fija ShowDetail en la fila o columna de resumen de ese grupo: ws.Rows(6).ShowDetail = True expande el
grupo cuyo resumen es la fila 6, y = False lo colapsa, mientras cada otro grupo se queda como estaba. Usa
ShowLevels para una vista uniforme de toda la hoja y ShowDetail para una sección a la vez.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 16/09/2026.
Guías relacionadas: VBA Group Rows · VBA Group Columns · VBA Pivot Table · VBA WorksheetFunction · VBA Used Range
