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

VBA ocultar columnas y filas en Excel — ocultar no es eliminar (y por qué tus totales no cambian)

|

VBA ocultar columnas y filas en Excel — ocultar no es eliminar (y por qué tus totales no cambian)

TL;DR — Ocultar es la más suave de las tres ediciones estructurales, y la más malentendida. A diferencia de eliminar (que quita filas) o insertar (que las añade), ocultar no cambia nada de los datos — fija en cero el tamaño de visualización de una columna o una fila. Las celdas siguen ahí, siguen en cada SUM, se siguen copiando cuando copias el rango, siguen siendo del todo editables por código. .Hidden = True vive en .EntireColumn / .EntireRow, no en una celda suelta. La trampa que pilla a todo el mundo: ocultar una columna no la quita de un total — SUM(B:B) sigue sumando la columna B oculta. Oculta para presentar; si necesitas que algo desaparezca de un cálculo, eso es eliminar, filtrar o SUBTOTAL — no ocultar.

' Oculta las columnas auxiliares B:D; oculta cada fila cuyo Status sea "Done".
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Report")

ws.Columns("B:D").Hidden = True                 ' columnas enteras, una sola instrucción
ws.Rows("2:1000").EntireRow.Hidden = False      ' parte de todo visible, luego oculta de forma selectiva
Dim i As Long
For i = 2 To 1000
    ws.Rows(i).Hidden = (ws.Cells(i, "Status").Value = "Done")
Next i

Ocultar parece la más simple de las tres operaciones, y mecánicamente lo es — una sola propiedad booleana. Lo que la hace merecedora de una guía es el modelo mental, porque «ocultar» significa en silencio algo distinto de lo que la mayoría supone. La gente recurre a ella para excluir datos — de una vista, de un total, de una copia — y ocultar solo hace lo primero de esas cosas. Tener eso claro es toda la batalla; la sintaxis ocupa más o menos una línea.

Lo que aprenderás

  • El modelo mental — ocultar redimensiona a cero, no quita ni excluye los datos
  • Por qué .Hidden pertenece a .EntireColumn y .EntireRow
  • La trampa que pilla a todo el mundo — las celdas ocultas siguen contando en las fórmulas y en las copias
  • Mostrar de nuevo — la mitad olvidada, y la línea que rescata una hoja atascada
  • Filas ocultas a mano frente a filas ocultas por AutoFilter cuando recorres un bucle

El modelo mental: oculto es de ancho cero, no desaparecido

Eliminar quita una fila; insertar añade una. Ocultar no hace ninguna de las dos — toma una fila o columna existente y fija su alto o ancho en cero para que no se dibuje en pantalla. Todo lo demás queda igual. Los datos permanecen exactamente donde estaban, en exactamente la misma dirección; Range("B2") sigue leyendo y escribiendo el valor en una columna B oculta sin ningún problema. Una fila oculta no es una fila eliminada disfrazada — es una fila plenamente presente a la que simplemente le has dicho a Excel que no dibuje.

Por eso ocultar es la edición estructural no estructural: cambia la visualización, no la cuadrícula. La fila 6 sigue siendo la fila 6 cuando está oculta; nada subió, nada bajó, así que aquí no hay trampa de dirección del bucle — puedes ocultar y mostrar en un simple bucle de arriba abajo todo el día. La sutileza no está en cómo ocultas; está en creer que los datos se fueron a algún sitio. No se fueron.

La regla de sintaxis: .Hidden vive en la columna o fila entera

Hidden es una propiedad de una columna entera o de una fila entera — no de una celda o un bloque cualquiera. No puedes ocultar B2:B10; ocultas las columnas o filas a las que pertenecen esas celdas. Así que o bien te diriges directamente a la columna o fila entera, o asciendes un rango de celdas con .EntireColumn / .EntireRow:

ws.Columns("B").Hidden = True                 ' oculta la columna B
ws.Columns("B:D").Hidden = True               ' oculta B, C y D
ws.Rows("10:20").Hidden = True                ' oculta las filas de la 10 a la 20
ws.Range("B2:D2").EntireColumn.Hidden = True  ' asciende un rango de celdas a sus columnas completas

Intenta fijar .Hidden en un rango parcial y o bien te dará un error o bien ocultarás más de lo que pretendías, porque la propiedad sencillamente no está definida a nivel de celda. .EntireColumn y .EntireRow son los mismos ascensos que usas para eliminar e insertar — el movimiento recurrente que te lleva de «estas celdas» a «la columna o fila entera en la que están».

La trampa que pilla a todo el mundo: las celdas ocultas siguen contando

Esta es la creencia que provoca errores de verdad: ocultar una columna la quita de mis totales. Pues no. Ocultar es un ajuste de visualización; no tiene efecto sobre el cálculo. =SUM(B:B) incluye la columna B oculta. =SUM(A2:A100) incluye cada fila oculta de ese tramo. Copia un rango que abarque columnas ocultas y los valores ocultos se van con él al pegar. Grafica una serie oculta y — salvo que le digas otra cosa al gráfico — puede desaparecer, o puede que no. Ocultar cambia lo que una persona ve, y casi nada de lo que una fórmula o una copia hacen.

Así que si tu verdadero objetivo es «dejar estos valores fuera del total», ocultar es la herramienta equivocada, y recurrir a ella produce un informe cuyos números no cuadran con sus filas visibles. Las herramientas correctas:

  • SUBTOTAL(109, ...) o AGGREGATE — estas ignoran las filas ocultas por un filtro (y SUBTOTAL(109) también ignora las filas ocultas a mano), así que un total filtrado se actualiza a medida que filtras.
  • AutoFilter — oculta y excluye de SUBTOTAL, la forma honesta de «mostrar y totalizar solo las filas coincidentes».
  • Eliminar — si los datos de verdad no deberían existir, quítalos (mira VBA eliminar filas).

Usa .Hidden cuando los datos deban quedarse, quedarse en los cálculos y simplemente no recargar la vista — columnas auxiliares detrás de un panel, filas de trabajo junto a un resumen impreso. Para eso sirve ocultar.

Mostrar de nuevo: la mitad olvidada y la línea de rescate

Cada ocultación necesita una reaparición que la acompañe, y el error es olvidar que una selección más amplia debe encargarse de mostrar de nuevo. Si la columna B está oculta y solo tocas Columns("B"), un usuario que nunca ejecute tu macro no puede recuperarla a mano con facilidad — tiene que seleccionar cruzando el hueco. En código, el rescate fiable es mostrar a lo largo de un rango generoso, o de toda la hoja:

ws.Columns("A:Z").Hidden = False   ' muestra cualquier columna oculta en A:Z
ws.Rows("1:1000").Hidden = False   ' muestra cualquier fila oculta en ese tramo
ws.Cells.EntireColumn.Hidden = False   ' opción nuclear: muestra TODAS las columnas de la hoja
ws.Cells.EntireRow.Hidden = False       ' ...y todas las filas

ws.Cells.EntireColumn.Hidden = False es la línea que hay que recordar — lo muestra todo, sin importar qué columnas estaban ocultas ni quién las ocultó. Una distinción más que conviene conocer: fijar Columns("B").ColumnWidth = 0 también hace invisible una columna, pero no es lo mismo que .Hidden = True.Hidden es la propiedad de verdad, sobrevive limpiamente a las idas y vueltas, y es lo que activa «Mostrar» en la interfaz. Prefiere .Hidden; trata un ancho literal de cero como un fallo que corregir, no como una técnica.

Filas ocultas frente a filas filtradas: el mismo indicador, distinto al recorrer un bucle

Tanto una fila oculta a mano como una fila oculta por AutoFilter informan de .Hidden = True, así que un bucle que comprueba If ws.Rows(i).Hidden no puede distinguirlas — lo que importa cuando quieres actuar sobre «solo las filas que el usuario puede ver». La forma limpia de tomar las celdas visibles es SpecialCells:

' Recorre solo las filas actualmente visibles (salta tanto las ocultas como las filtradas).
Dim rng As Range, area As Range
On Error Resume Next
Set rng = ws.Range("A2:A1000").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not rng Is Nothing Then
    For Each area In rng.Areas          ' las celdas visibles vuelven como varios bloques
        ' ... procesa area ...
    Next area
End If

Dos cosas que interiorizar. Primero, SpecialCells(xlCellTypeVisible) devuelve las celdas visibles como varias áreas (cada tramo ininterrumpido de filas visibles es un área), así que itera .Areas, no un único bloque contiguo. Segundo, un simple bucle For i = 2 To 1000 visita las filas ocultas y filtradas igual que cualquier otra — ocultar no quita una fila de la iteración, solo de la vista. Si te refieres a «las filas en pantalla», pide las celdas visibles de forma explícita; no des por supuesto que el bucle se salta las ocultas.

Cómo ayuda ExcelMaster

Ocultar no hace tropezar a la gente por la sintaxis, sino por las expectativas: totales que se empeñan en incluir columnas ocultas, una hoja que nadie logra desatascar porque el rango de mostrar era demasiado estrecho, un bucle que procesa filas filtradas porque .Hidden no significaba lo que creían. Las soluciones son todas pequeñas y todas fáciles de pasar por alto.

ExcelMaster te deja describir la intención — «oculta las columnas auxiliares de la B a la D», «oculta cada fila marcada como Done», «muestra en el total solo las filas visibles». Escribe .EntireColumn.Hidden / .EntireRow.Hidden correctamente, recurre a SUBTOTAL o a SpecialCells(xlCellTypeVisible) cuando de verdad quieres «excluir del cálculo» en lugar de solo «ocultar», y te da un camino para mostrarlo todo de golpe para que ninguna hoja acabe atascada. Te quedas con el libro y con el código; te ahorras la sorpresa de un total que ignora lo que te están diciendo los ojos.

Preguntas frecuentes

¿Cómo oculto una columna en VBA?

Fija .Hidden = True en la columna entera: ws.Columns("B").Hidden = True, o ws.Columns("B:D").Hidden = True para varias. Desde un rango de celdas, asciéndelo primero: ws.Range("B2:D2").EntireColumn.Hidden = True. .Hidden es una propiedad de una columna o fila entera, así que no puedes aplicarlo a un rango parcial.

¿Ocultar una columna la quita de un SUM en Excel?

No. Ocultar solo cambia la visualización — =SUM(B:B) sigue incluyendo la columna B oculta, y copiar un rango sigue copiando los valores ocultos. Para excluir celdas de un total, usa SUBTOTAL(109, ...) o AGGREGATE (que ignoran las filas filtradas, y con 109 también las ocultas a mano), aplica un AutoFilter o elimina los datos. Ocultar es presentación, no cálculo.

¿Cómo muestro todas las columnas y filas en VBA?

Usa ws.Cells.EntireColumn.Hidden = False para mostrar todas las columnas y ws.Cells.EntireRow.Hidden = False para mostrar todas las filas. Como apunta a toda la hoja, funciona sin importar qué columnas o filas estaban ocultas — el rescate fiable para una hoja en la que no encuentras las ocultas a mano.

¿Cómo oculto filas según el valor de una celda?

Recorre las filas y fija .Hidden a partir de una prueba: ws.Rows(i).Hidden = (ws.Cells(i, "C").Value = "Done"). Como ocultar no desplaza la cuadrícula, un simple bucle de arriba abajo va bien — no hace falta recorrer hacia atrás como harías al eliminar. Parte de un estado de todo visible para que las filas antes ocultas se restablezcan.

¿Por qué mi bucle sigue procesando filas ocultas?

Porque ocultar una fila no la quita de la iteración — un bucle For i = 2 To 1000 visita las filas ocultas y filtradas igual que las visibles. Para actuar solo sobre lo que hay en pantalla, obtén las celdas visibles con Range(...).SpecialCells(xlCellTypeVisible) e itera sus .Areas; una prueba manual de .Hidden no puede distinguir las filas ocultas por filtro de las ocultas a mano.

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 07/08/2026.

Guías relacionadas: VBA eliminar filas · VBA insertar filas y columnas · VBA Range · VBA For Loop · VBA última fila