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 = Truevive 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 oSUBTOTAL— 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é
.Hiddenpertenece a.EntireColumny.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, ...)oAGGREGATE— estas sí ignoran las filas ocultas por un filtro (ySUBTOTAL(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
