TL;DR —
Columns("B:D").Grouppliega las columnas B a D detrás de un esquema (outline) horizontal en la parte superior de la hoja —el mismo pliegue que agrupar filas, girado noventa grados—. Dos cosas específicas de las columnas hacen tropezar a la gente: el botón de colapso cae por defecto a la derecha del grupo (Outline.SummaryColumn), y agrupar solo funciona sobre columnas enteras —un rango parcial no agrupa las columnas—.
Sub GroupMonthColumns()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Report")
ws.Cells.ClearOutline ' empieza plano para que al reejecutar no se apilen niveles
ws.Outline.SummaryColumn = xlSummaryOnLeft ' el boton se ata a la columna de totales de la IZQUIERDA
ws.Columns("C:N").Group ' pliega las 12 columnas de meses tras el total en B
ws.Outline.ShowLevels ColumnLevels:=1 ' colapsa solo columnas, dejando los grupos de filas intactos
End Sub
Agrupar columnas es agrupar filas en el otro eje: el mismo verbo .Group, el mismo
objeto Outline por debajo, la misma regla de colapsar por nivel. Lo que cambia con
las columnas es el lado al que apunta el botón por defecto y el hecho de que «una columna» significa la
columna entera —el eco exacto de la regla «inserta la EntireColumn, nunca
un rango parcial» de las ediciones estructurales—.
Lo que aprenderás
- El modelo mental — un pliegue horizontal, el esquema de filas girado noventa grados
- La trampa de SummaryColumn — por qué el botón cae a la derecha, y cómo moverlo a la izquierda
- Por qué agrupar necesita columnas enteras, y qué hace en su lugar un rango parcial
- Cómo
ShowLevelscolapsa las columnas en su propio eje, independiente de los grupos de filas - Por qué agrupar una columna no es lo mismo que ocultarla o cambiar su ancho
El modelo mental: un pliegue horizontal
Columns("B:D").Group construye una barra de esquema a lo largo de la parte superior de la hoja, con un
botón − que pliega las columnas B a D fuera de la vista y un + que las trae de vuelta. Es el esquema de
filas rotado noventa grados —en vez de plegar bloques de filas en un margen a la izquierda, pliegas bloques
de columnas en una barra arriba—.
Todo lo que es cierto sobre agrupar filas lo es aquí: las columnas quedan
plegadas, no ocultas en el sentido de .Hidden ni eliminadas; el esquema las organiza en niveles hasta
ocho de profundidad; y colapsas por nivel en vez de tocar .Hidden. Este artículo trata sobre las dos
cosas que son específicamente distintas cuando el eje son las columnas.
La trampa de SummaryColumn: el botón cae a la derecha
Agrupa las columnas B a D y el botón de colapso no aparece sobre el grupo, sino a la derecha, sobre la
columna E. Eso es Worksheet.Outline.SummaryColumn tomando por defecto xlSummaryOnRight: Excel asume que
tu columna de resumen o total está a la derecha del detalle que resume.
Eso es el espejo del valor por defecto de la fila de resumen, y es incorrecto por la misma razón en un diseño habitual —una columna de totales colocada a la izquierda, antes de una tanda de detalle mensual—:
ws.Outline.SummaryColumn = xlSummaryOnLeft ' el boton se ata a la columna de totales de la IZQUIERDA
ws.Columns("C:N").Group ' el total es la columna B, el detalle son las columnas C-N
Déjalo en el valor por defecto y el + flota hacia la derecha de tu último mes, desprendido del total en
la columna B que el lector está mirando. SummaryColumn es un ajuste de hoja completa —fíjalo una vez,
antes de construir el esquema, para que encaje con el lado en el que están tus totales—. Fíjate en que la
ortografía de la constante difiere de la versión de filas: las columnas usan xlSummaryOnLeft /
xlSummaryOnRight, las filas usan xlSummaryAbove / xlSummaryBelow.
Agrupa columnas enteras, nunca un rango parcial
Agrupar columnas solo significa algo cuando nombras columnas enteras:
ws.Columns("B:D").Group ' pliega tres columnas enteras
ws.Range("B:D").EntireColumn.Group ' identico, escrito por extenso
Dale a .Group un rango parcial y no plegará las columnas:
ws.Range("B2:D2").Group ' NO agrupa las columnas B-D
Un rango que no son columnas enteras no puede convertirse en un grupo de columnas —según la hoja obtienes
un error en tiempo de ejecución o un agrupamiento que no pretendías—. Es la misma regla que rige insertar y
eliminar: para actuar sobre una columna, nombra una columna (Columns(...) o .EntireColumn), la
misma disciplina que insertar la EntireColumn. Si tienes una celda de
encabezado y necesitas su columna, amplíala primero a la columna entera:
ws.Rows(1).Find("Q1", LookAt:=xlWhole).EntireColumn.Group ' encuentra el encabezado, agrupa su columna entera
ShowLevels colapsa las columnas en su propio eje
El esquema rastrea filas y columnas como dos ejes independientes, por eso ShowLevels acepta dos
argumentos:
ws.Outline.ShowLevels ColumnLevels:=1 ' colapsa el esquema de COLUMNAS al nivel 1
ws.Outline.ShowLevels RowLevels:=2, ColumnLevels:=1 ' fija los dos ejes en una sola llamada
Pasar solo ColumnLevels pliega las columnas dejando cualquier agrupamiento de filas exactamente donde
estaba —los dos esquemas no interfieren entre sí—. Esta es la recompensa de manejar el
objeto Outline en vez de ocultar las cosas a mano: te diriges a un eje sin
perturbar el otro, y los botones se mantienen fieles a la realidad.
Agrupar no es ocultar, ni es el ancho
Como un grupo de columnas colapsado parece una columna oculta, es fácil confundir tres herramientas distintas. No son intercambiables:
- Group construye un esquema reversible y consciente de los niveles, con botones que el lector puede pulsar —acertado cuando las columnas son detalle que plegas y vuelves a abrir—.
- Ocultar (
.Hidden = True) es un estado plano de encendido/apagado, sin esquema y sin botón —acertado cuando simplemente quieres una columna fuera de la vista—. - Ancho de columna (
.ColumnWidth = 0) es un tamaño, no un estado de visibilidad —una intención distinta otra vez—.
Recurre a agrupar cuando quieras una sección plegable que el lector controle; recurre a ocultar cuando quieras una columna sencillamente fuera del camino. Usar una donde querías la otra es el error —una columna agrupada que el lector puede reabrir cuando la querías firmemente oculta, o una columna oculta sin nada de la estructura de esquema que buscabas—.
Cómo te ayuda ExcelMaster
Agrupar columnas es una línea que esconde tres decisiones —en qué lado va el botón de colapso para tu
diseño, si le pasaste columnas enteras o un rango parcial que en silencio no hace nada, y si de verdad
querías un grupo plegable en vez de un simple ocultamiento— y equivocarte en cualquiera de ellas falla sin
ningún error: un botón que flota a la derecha de un total situado a la izquierda, una llamada a .Group
que no agrupó nada, o un lector reabriendo una columna que querías oculta.
ExcelMaster te deja decir lo que
quieres —«pliega las doce columnas de meses tras la columna de totales, botón a la izquierda, colapsado»—
y ajusta SummaryColumn para que encaje, agrupa las columnas enteras (nunca un rango parcial), colapsa con
ColumnLevels para que los grupos de filas se queden quietos, y recurre a ocultar en su lugar cuando eso es
lo que de verdad querías. Tú conservas el libro y el código.
Preguntas frecuentes
¿Cómo agrupo columnas en VBA?
Llama a .Group sobre columnas enteras: Columns("B:D").Group pliega las columnas B a D detrás de una
barra de esquema horizontal con un botón de colapso a lo largo de la parte superior. Cualifica la hoja —
ThisWorkbook.Worksheets("Report").Columns("B:D").Group— para que no dependa de la hoja activa. Las
columnas quedan plegadas, no ocultas ni eliminadas.
¿Por qué el botón de colapso está a la derecha de mis columnas agrupadas?
Porque Worksheet.Outline.SummaryColumn toma por defecto xlSummaryOnRight, que asume que tu columna de
totales está a la derecha del detalle. Si tu columna de totales está a la izquierda, pon
ws.Outline.SummaryColumn = xlSummaryOnLeft antes de agrupar para que el botón se ate a ella.
¿Por qué agrupar no hace nada cuando paso un rango como B2:D2?
Porque un rango parcial no son columnas enteras, y solo las columnas enteras pueden formar un grupo de
columnas. Usa Columns("B:D").Group o Range("B:D").EntireColumn.Group. Para agrupar la columna en la que
está un encabezado, encuéntralo y amplíalo a la columna entera:
Rows(1).Find("Q1", LookAt:=xlWhole).EntireColumn.Group.
¿Cómo colapso columnas agrupadas sin afectar a las filas agrupadas?
Pasa solo el eje de columnas a ShowLevels: ws.Outline.ShowLevels ColumnLevels:=1 colapsa el esquema de
columnas dejando intacto cualquier agrupamiento de filas. El esquema rastrea filas y columnas como ejes
independientes, así que fijar uno no perturba el otro.
¿Agrupar una columna es lo mismo que ocultarla?
No. Agrupar construye un esquema reversible con un botón que el lector puede pulsar para plegar y
desplegar las columnas; ocultar (.Hidden = True) es un estado plano de encendido/apagado sin esquema ni
botón. Usa agrupar para una sección plegable que el lector controle, y
ocultar cuando simplemente quieras la columna fuera de la vista.
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 Outline · VBA Hide Columns · VBA Column Width · VBA Insert Columns
