Hojas de cálculo en Excel - página principal

Ocultar filas y columnas mediante macros

Muchos de los internautas que aterrizan en este blog, lo hacen buscando unas pequeñas líneas de código, o un macro, que le permitan ocultar filas o columnas para completar algún procedimiento que tienen entre manos. Como es mi interés dar respuesta a sus inquietudes, vamos a tratar hoy este tema.

Si lo que deseamos es ocultar la fila activa, es decir, la fila donde estamos situados, nos bastará copiar el presente código en un módulo VBA (ya sabéis, Alt+F11, para entrar en modo VBA):


Sub Ocultar_fila()
'Nos fijamos en la celda
'donde estamos situados

celda = ActiveCell.Address
'Seleccionamos la fila a la
'que pertenece la celda activa

ActiveCell.EntireRow.Select
'Ocultamos la fila
Selection.EntireRow.Hidden = True
'Nos situamos en la fila anterior,
'siempre que no estemos ya en la primera

If ActiveCell.Row <> 1 Then
'vamos a la fila anterior
Range(celda).Offset(-1, 0).Select
Else
'vamos a la fila siguiente
Range(celda).Offset(1, 0).Select
End If
End Sub


Si lo que deseamos es ocultar la columna de la celda activa, nos bastará con modificar ligeramente el código anterior, para dejarlo de la siguiente forma:


Sub Ocultar_columna()
'Nos fijamos en la celda
'donde estamos situados

celda = ActiveCell.Address
'Seleccionamos la columna a la
'que pertenece la celda activa

ActiveCell.EntireColumn.Select
'Ocultamos la columna
Selection.EntireColumn.Hidden = True
'Nos situamos en la columna anterior,
'siempre que no estemos ya en la primera

If ActiveCell.Column <> 1 Then
'vamos a la columna anterior
Range(celda).Offset(0, -1).Select
Else
'vamos a la columna de la derecha
Range(celda).Offset(0, 1).Select
End If
End Sub


Pero quizás deseéis ocultar varias filas de golpe. En este caso, informaremos dentro del propio código, de las filas a ocultar. En el caso del ejemplo que os pongo a continuación, ocultaremos desde la fila 5 a la fila 20:


Sub Ocultar_varias_filas()
'Seleccionamos las filas a ocultar
Rows("5:20").Select
'Las ocultamos
Selection.EntireRow.Hidden = True
'Nos situamos en A1
Range("A1").Select
End Sub


Si por el contrario, queremos ocultar un grupo de columnas, nos bastará con informar de ello en el macro, a la vez que modificamos el código anterior para hacer referencia a las columnas (columns), en lugar de a las filas (rows):


Sub Ocultar_varias_columnas()
'Seleccionamos las columnas a ocultar
Columns("F:M").Select
'Las ocultamos
Selection.EntireColumn.Hidden = True
'Nos situamos en A1
Range("A1").Select
End Sub



47 comentarios:

Anónimo dijo...

Hola, Gracias por la información... solo que ahora tengo un problema adicional... tengo un archivo de excel con macros para ocultar alguna columnas; protegi la hoja y quice ejecutar nuevamente la Macro, pero me salio un error (revise el Debug) y la instruccion es que no se puede ejecutar la seleccion para ocultar las columnas; hay alguna otra forma de que se ejecute la macro pero que tambien se protejan las columnas????
mi correo velejoje@yahoo.com.mx

Gracias

Javier Marco dijo...

Simplemente como primera línea del macro, lo que tienes que hacer es desproteger la hoja, seguidamente se ejecutará la parte del código donde se ocultan las columnas, y al finalizar el macro lo que tienes que hacer es volver a proteger la hoja.

Échale un vistazo a esta entrada para saber como proteger y desproteger una hoja mediante macros (ahí verás las líneas iniciales y finales que tienes que incluir en el macro).

Salu2

Anónimo dijo...

JAVIER, muchas gracias por la información... pero, al ejecutar la macro se me presenta un incoveniente con el que quizas puedas ayudarme...

tengo una planilla;(A5:H81)en la cual mediante otra macro cada fila va tomando un valor a medida que se ejecuta, (por ejemplo, ventas diarias). en la planilla se pueden ingresar 80 filas con datos de ventas, y en la última; la fila 81 están las sumas correspondientes a cada item de las columnas,
al fin del día, al revisar el listado quisiera que las filas que no se ocuoparon se oculten, es decir, las filas vacias entre la fila 6 y la fila 80.
al ejecutar tu macro se me esconden efectivamente el rango de celdas de mi selección, pero todas, independiente si tienen valores o no...
como podría solucionar esto?¿?¿

de antemano muchas gracias.

fausto_

Javier Marco dijo...

Hola que tal...

Quizás te interese más la opción de eliminar directamente las filas que están vacías, sin necesidad de ocultarlas. Es decir, que desaparezcan de la hoja de cálculo.

Mírate este artículo donde hablo de como eliminar filas vacías.

Salu2

Diego dijo...

Hola! Muy bueno tu blog! Tengo otra inquietud.

Tengo una planilla en las que tengo datos laens columnas C:AJ. Desde la primer columna hasta la última tengo los mismos títulos (Recibido/Procesado).
Es decir, la columna C es "REcibido", la D es "PRocesado" y la E es "Recibido" etc...

1º Quiero generar una macro que me oculte las columnas que dicen "Recibido".
2º Quiero que esa misma macro me oculte la fila nº 13.

Se puede hacer?

Muchas gracias por tu ayuda!

Javier Marco dijo...

Hola que tal...

Prueba este macro (cambia la primrea línea, por si los encabezados con´los rótulos de las columnas no empiezan en C1, como te pongo yo en el ejemplo):

Sub Ocultar_recibido()
'Nos situamos en C1
Range("C1").Select
Do While Not IsEmpty(ActiveCell)
If Trim(LCase(ActiveCell)) = "recibido" Then
'Ocultamos la columna
Selection.EntireColumn.Hidden = True
End If
'pasamos a la siguiente columna
ActiveCell.Offset(0, 1).Select
Loop
'Ocultamos la fila
Range("A13").Select
Selection.EntireRow.Hidden = True
'Nos situamos en D1
Range("D1").Select
End Sub

Saludos

Diego dijo...

Muchas gracias! muy buena tu solución. funciona 100%!

voy a recomendar tu blog.
un saludo

Javier Marco dijo...

Muchas gracias :-)

Anónimo dijo...

Buen día,

Espero todo bien. El problema que tengo con respecto de mi macro es que quiero ocultar filas, pero en una macro que corre previo, el usuario del formulario debe insertar filas. Cuando el usuario inserta fila... las columnas que abajo se ocultan se desconfiguran y terminan siendo las filas que no quiero que se oculten. Será que me pueden ayudar con esto?? Gracias...

Mi correo es: dathba@yahoo.com

Javier Marco dijo...

Para hacer eso, te aconsejo que te guíes por el contenido de alguna celda de esa fila que quieres ocultar. Es decir, si en una fila tienes por ejemplo el texto "casa", y antes estaba en A17, y ahora en A18, porque un usuario ha insertado una fila, solo tienes que buscar en un rango de filas (bucle "FOR"), alguna celda que contenga el texto "casa".

Salu2

Anónimo dijo...

Javier, muchísimas gracias... de verdad que estaba sencillo... pero a veces creo que la frustración lo vence a uno...

Gracias por el dato!!!

Anónimo dijo...

Hola, excelente blog...

Mi consulta es la siguiente:
Tengo una planilla bastante compleja que utilizo para computar y presupuestar obras de arquitectura. En una hoja tengo todos los análisis de precios de los Items posibles de computar (cada uno de ellos tiene las mismas columnas y varia la cantidad de filas de acuerdo a cada caso), como no siempre necesito utilizar todos los ítems disponibles, en cada uno de ellos condicioné para que los compute a un valor "1" o "0" en una celda. Ahora lo que quiero hacer es una macro que me permita ocultar o mostrar las filas de un item según el valor de la celda mencionada sea "1" o "0".
Además: Puede ser eso realizado automáticamente, es decir que si "la celda" tiene el valor "1" muestre las filas y si tiene el valor "0" las oculte?

Muchas gracias.
César Ortiz.

Anónimo dijo...

Hola lo que necesito es que oculte filas que tengan un texto especifico, por ejemplo en mi rango a1:f86 tengo datos en la columna d niños, niñas, adultos etc y lo que necesito es que con la macro oculte la selecciòn que escoji y que a la vez funcione en la hoja enero, en la hoja febrero etc.

Anónimo dijo...

Hola,

Acabo de ver la manera de ocultar líneas, pero me gustaría saber si hay posibilidad de ocultarlas dependiendo de una cadena de texto:

Tengo un listado de referencia y quiero que, basándome en una cadena de texto, fuera ocultando las líneas que no coincidan.

Muchas gracias por toda la información que compartes.


Paco

Javier Marco dijo...

Hola Paco. Prueba algo como esto:

Sub prueba()
'informamos del texto a controlar
texto = "pon aqui el texto que quieras"
Do While Not IsEmpty(ActiveCell)
'miramos si ese texto está en la celda activa
'y ocultamos la fila en ese caso
If InStr(ActiveCell, texto) > 0 Then Selection.EntireRow.Hidden = True
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
End Sub

Monica dijo...

Buenas tardes, yo quisiera hacer esto: que dependiendo del usuario de red (microsoft), permita modificar sólo algunas columnas.
Intente usando la instrucción que das del username, pero esta instrucción trae el usuario que se colocó cuando se instaló el office no el usuario logeado en windows.

Gracias,

Mónica

Javier Marco dijo...

Hola Mónica. Échale un vistazo a esta entrada: Obtener el nombre del PC y a esta otra: usuarios, hojas, y permisos, pues te van a ser muy útiles para desarrollar eso que pretendes.

Saludos

Elda Vinci dijo...

Hola Javier, tengo una consulta que aunque no tiene que ver con ocultar filas, me afecta a una hoja que estoy haciendo que hace estas ocultaciones cuando se imprime y despues de imprimir vuelven a aparecer. Necesito saber si el usuario esta imprimiendo la hoja o está haciendo una presentación preliminar de la hoja.
Te explico, mi hoja cuando se imprime necesito que sume en un contador cuantas veces ha sido impresa, lo malo es que cuando hago la presentación preliminar tambien me lo suma como si esta hoja hubiera sido impresa. Hay alguna forma de diferenciarlo?.

Perdona que te lo mande aqui pero no se donde hacerte la consulta, gracias de antemano.

Anónimo dijo...

Buen dia

Muy interesante la informacion en el blog

Tengo una duda que espero me la puedas resolver, lo que quiero es segun el valor que se le de a una celda sea la columna que oculte, por ejemplo se el valor de la celda es 1 que oculte la columna F, si es 2 la G... y asi sucesivamente

Espero tu respuesta

Luis

Anónimo dijo...

muchisimas gracias por ayudar a gente anónima de forma tan desinteresada.
tengo una duda, y es la siguiente, yo lo que quiero (si se puede) es crear una macro para ocultar lineas que estan en blanco es decir sin informacion, el problema es que nunca son las mismas, y esta información viene de tres hojas diferentes, es decir un mes puede ser que tenga que ocultar por ejemplo de la linea 54 a la 58 de la 60 a la 68 y de la 70 a la 90, pero como digo esto es aleatorio.
En resumen la macro que necesito deberá reconocer dentro de una serie de lineas las que esten en blanco y ocultarlas ¿esto es posible? mi correo es joansare@hotmail.com.
Muchas gracias.
un saludo.

Javier Marco dijo...

Entre lo que hay en este artículo que acabas de leer, y este otro para eliminar filas vacías, donde se explica como averiguar si una fila está vacía o no, podrás tener ese macro.

Un saludo.

Jairo Gu´tiérrez dijo...

Es el Blog más didactico que he visitado.
Mi consulta es la siguiente:
Necesito crear un formulario que permita, de acuerdo a la activación de casillas de verificación o botones de opción, cambiar las características de una o varias hojas del libro.
Específicamente: En la primera hoja de un libro quiero crear un formulario en el que se tengan varias opciones (casillas de verificación o botones de opción)que permitan, según la elección que se haga, ocultar o mostrar algunas columnas de otras hojas en las que tengo unas tablas que el usuario consultará. Agradézco mucho la ayuda que me puedan brindar; y los felicito de manera categórica por la labor que están adelantando.

Parcerus dijo...

Amigo encontré esto en tu macro, resulta que al ejecutar la macro de las filas que tu muy amablemente pusiste me paso lo mismo que al uno de los comentaristas, que ocultaba todo, entonces me puse a "cacharrear por ensayo y error" y encontré la solución:

Cambié el código:
Selection.EntireColumn.Hidden = True

Por el rango de las columnas a ocultar:

Selection.Columns("F:K").Hidden = True

Y dejé el resto del código como estaba y todo quedó así

Sub ocultar()
'Seleccionamos las columnas a ocultar
Columns("F:K").Select
'Las ocultamos
Selection.Columns("F:K").Hidden = True
'Nos situamos en A1
Range("A1").Select
End Sub


Y me funciona de maravilla el código, un saludo y espero que les sirva. Ha si y gracias por publicar los otros códigos, realmente me están ayudando mucho.

Pedro dijo...

Hola,
Necesito que en una hoja de cálculo todas las filas que tienen un valor cero se oculten y que al tener un valos >0 se muestren automáticamente.
¿Es posible?
Saludos

Javier Marco dijo...

Prueba esto para ocultar las filas:

Sub Ocultamos()
'ocultamos el procedimiento
Application.ScreenUpdating = False
'nos situamos en A1
Range("A1").Select
'hasta la fila 2000
For i = 1 To 2000
'si la celda activa es cero, o está
'vacía, ocultamos la fila (ojo, no miramos
'si en esa misma fila, hay datos distintos
'de cero, pues solo miramos la celda)
If ActiveCell = "" Or ActiveCell = 0 Then
'ocultamos la fila
Selection.EntireRow.Hidden = True
End If
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Next
'mostrams el procedimiento
Application.ScreenUpdating = True
End Sub

Y para mostrar las filas, esto:

Sub Mostramos()
'ocultamos el procedimiento
Application.ScreenUpdating = False
'nos situamos en A1
Range("A1").Select
'hasta la fila 2000
For i = 1 To 2000
'mostramos todas las filas
Selection.EntireRow.Hidden = False
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Next
'mostrams el procedimiento
Application.ScreenUpdating = True
End Sub

Saludos.

Pedro dijo...

Hola Javier Marco,
El problema es que es la primera macro que tengo que crear y con lo que me dices no se que es lo que tengo que escribir y lo que son instrucciones que me das.
¿Serías tan amable de indicarme lo que es que tengo que poner en la macro?.
Muchas gracias por tu inestimable ayuda y perdona las "exigencias".
Saludos

Javier Marco dijo...

Hola Pedro.

Veamos... Lo primero que necesitarás, es saber cómo hacer macros. Una vez aprendido eso, también puedes pasarte por este artículo donde se explica como asociar un macro a un botón, procurando poner el botón en una fila con datos, para no ocultar el propio botón. Finalmente solo tendrás que poner el código que te puse en mi respuesta anterior.

Dedícale un ratito, y verás como está "chupao".

Saludos.

Anónimo dijo...

hola.
las macros me llegan a ocultar las columnas por decir del F:U, pero desde excel los puedo volver a seleccionar y mostrar columnas ocultas, lo que deseo es q no se pueda mostrar las columna desde la hoja excel, solamente q la macros tenga esa posibilidad, se podra hacer????? gracias

Javier Marco dijo...

Este macro serviría para que cada vez que abras el fichero, se oculten los encabezados de filasy columnas:

Sub Auto_open()
ActiveWindow.DisplayHeadings = False
End Sub

Para mostrarlos, tan solo debes cambiar el False, por True

Saludos.

Anónimo dijo...

Excelentes aportes de macros. Muchas gracias a todos. necesito ayuda en una macro que me permita lo siguiente:

Tengo la siguiente tabla en excel 2007:
A B C D
1 EVENTOS DPTO.A DPTO.B DPTO.C
2 R/P 2 3 1
3 R/D 0 2 1
4 R/V 1 0 0
5 R/M 4 0
... R/LC 0 3
75 R/C 5 0 1

Lo que deseo es que en un Formulario con un LISTBOX se visualice solo los datos mayores a 0 o que no sean espacios en blanco, escogiendo un departamento cualesquiera en un formulario anterior con varios commandbuttons que tienen los nombres de los Dptos. Muchas gracias de antemano

CAT ESPERANZA dijo...

Hola mi pregunta es la siguiente. Se pueden ocultar varias columnas segun un valor de una celda. ejemplo si dice 3 en la celda A3 que solo deje tres años( de enero a diciembre) y si pongo 10 que me ponga 10 años de enero a diciembre. lo unico que se me ocurrio era poner un maximo de 10 años de Enero a Diciembre y ocultar las columnas segun un valor de una celda

Anónimo dijo...

Ante todo agradecerte la atención que nos dispensas a los principiantes.

He desarrollado una hoja en la que entre otras estan las siguientes macros.

"""ocultar fila"""
"""mostrar fila"""
estas dos asociadas a sendos botones.

luego quise aplicarlo a ocultar columna y tuve problemas con lo que llegué a este post.

Me funciona perfectamente con lo que ya tengo

"""ocultar columna"""

pero ahora me surge el problema que no acabo de depurar.

quiero que solamente me oculte la columna G, y solamente la G y si vinculo la macro a un botón, como es la celda activa, me surgen muchos problemas.

y luego, si bien he desarrollado correctamente """mostrar fila"....no termino de desarrollar """mostrar columna"""

Te reitero las gracias por tu atención

Amadeu

Julio Aguilar dijo...

Bueno he visto la macro y esta excelente lo que deseaba hacer, pero tengo un problema en mi libro de trabajo tengo 15 hojas de las cuales 10 de ellas tienen el mismo formato, y deseo saber si se puede crear una macro que oculte las filas de la A1:A40 las celdas vacías de las 10 hojas de una sola ves, y como las puedo ver tambien con una sola macro en un boto,,, Gracias por la ayuda

Oscar dijo...

Hola Javier,

Tengo el siguiente código, de acuerdo a tus indicaciones, las cuales agradezco enormemente..gracias!
Código:

Sub Ocultamos_Open()
'ocultamos el procedimiento
Application.ScreenUpdating = False
'nos situamos en D1
Range("D1").Select
'hasta la fila 7
For i = 1 To 7
'si la celda activa es cero, o está
'vacía, ocultamos la fila (ojo, no miramos
'si en esa misma fila, hay datos distintos
'de cero, pues solo miramos la celda)
If ActiveCell = "d" Then
'ocultamos la fila
Selection.EntireRow.Hidden = True
End If
'bajamos una fila
ActiveCell.Offset(1, 0).Select
Next
'mostrams el procedimiento
Application.ScreenUpdating = True
End Sub

Deseo que se ejecute automáticamente, cada vez que se abra el libro se ejecute el código, solo funciona si lo ejecuto manualmente

Gracias por tu ayuda

Saludos,

Oscar

Javier Marco dijo...

Para que te funcione, el macro debe llamarse forzosamente Auto_open(), así que cambia la primera línea:

Sub Ocultamos_Open()

Por esta otra:

Sub Auto_open()

Saludos.

julio aguilar dijo...

Buenas mi intención es ocultar una fila que no muestra datos pero que si tienen una formula pero la misma no tiene ningún valor ya que desde donde se jala no presenta valor alguno,, gracias si me ayudan ya que me urge gracias y no se como hacerlo

EH dijo...

Hola,

Tengo una hoja de excel en donde filtro algunos datos, por ende estos se ocultan. En una macro yo hago el conteo de las filas asi:
Range("A10").Select
Range(ActiveCell, ActiveCell.End(xlDown)).Select

filas = Selection.Count

Pero de esta manera obtengo todas las filas y solo deseo obtener la cuenta de las filas que estan visibles en el filtro

joanantoni.estopanan dijo...

Como puedo volver atras para que muestre las columnas una vez ocultadas y luego las vuelva a ocultarlas de nuevo cuando quiera?
Me parece muy bien la resolucion, pero se puede hacer esto creado un boton que cuando le dan oculta las columnas C y D, y cuando le vuelves a dar las muestra?

Espero me podais ayudar.

Saludos y gracias de antemano

Joan Antoni

Javier Marco dijo...

Prueba este ejemplo:

Sub ejemplo()
'si están ocultas...
If Columns("C:D").Hidden Then
'las hacemos visibles
Columns("C:D").Hidden = False
Else
'en caso contrario las ocultamos
Columns("C:D").Hidden = True
End If
End Sub

Saludos.

sete dijo...

Buenas tardes, Javier lo primero agradecerte tu experiencia y tu trabajo en este blog y la gran ayuda que das a gente como yo.
Hay va mi cuestion:
Actualmente, estoy realizando una hoja de calculo, con el fin de ocultar columnas por macros como muestras en este post, pero el codigo que muestras es por columnas correlativas, me gustaria utilizar este codigo pero para columnas no consecutivas. Tu macro:
Sub Ocultar_varias_columnas()
'Seleccionamos las columnas a ocultar
Columns("F:M").Select
'Las ocultamos
Selection.EntireColumn.Hidden = True
'Nos situamos en A1
Range("A1").Select
End Sub
-OCULTA LAS COLUMNAS DE LA F A LA M-

-ME INTERESARIA POR EJEMPLO QUE OCULTARA COLUMNA F Y LA S ENTONCES ESA ES MI PREGUNTA COMO OCULTAR COLUMNAS NO CORRELATIVAS CON EL MISMO CODIGO BASIC, YO PONGO columns(F:I:J)SIENDO COLUMNAS NO SEGUIDAS, PERO ME DA FALLO Y COMIENZA DEPURAR.

NECESITO UNA SOLUCION PLEASE AMIGO JAVIER, MUCHAS GRACIAS POR TU ATENCION Y UN SALUDO.

Javier Marco dijo...

En lugar de esta línea:
Columns("F:M").Select

Pon esta otra:
Range("F:F,I:I,J:J").Select

Anónimo dijo...

Hola Javier, Excelente blog !!

Veras tengo una hoja de calculo para llevar el registro numerico de unos libros por ejemplo de preescolar libro1, libro2, de primaria libro3,libro4, de secundaria libro5, libro6. Tengo también una lista de opciones (preescolar, primaria, secundaria) y quisiera que cuando seleccione una opcion de la lista me muestre solo los libros de esa opcion, es decir que se oculten las columnas que no correspondan a la opcion. Esta lista de opciones se repide filas abajo. La esctructura de la hoja tiene columas de la A a la G, en la primera columna (A) se encuentra el listado de opciones (el mismo para todas las filas de esa columna) en la columna B-C los libros de Preescolar, D-E los de primaria y F-G los de secundaria.

Se puede.. ??? Gracias por la atencion, mi correo es oskr_gamo90@hotmail.com

fofo dijo...

queira preguntar como seria con un formulario y checkbox's digamos 4 columnas aunque con 21 columnas seria genial XD

fofo dijo...

con este sencillo codigo pueden mostrar y ocultar 21 columnas por medio de un userform y 21 checkbox

Private Sub MostrarOcultar_Click()
Application.ScreenUpdating = False
For x = 1 To 21
If Controls("CheckBox" & x).Value = False Then
Columns(x + 1).EntireColumn.Hidden = True
Else
Columns(x + 1).EntireColumn.Hidden = False
End If
Next
Application.ScreenUpdating = True
End Sub

Anónimo dijo...

Hola Amigos. Tengo una duda y me gustaria me puedan ayudar,.Tengo una planilla de excel en donde mediante una macro, necesito ocultar valor en cero pero que se den en la misma fila.
Me explico: la planilla va desde la E21 a la s163.- pero si la fila m24 a la s24 completa me da cero que me la oculte.- Si me pueden ayudar se los agradezco.

Anónimo dijo...

Hola compañeros.
Tengo una consulta para los más entendidos. Dispongo de un listado de 25 filas, de las cuales quiero que se me muestren un número de filas igual al valor de una caelda.
Que código debería usar para tal función?
Ejemplo:
Casilla A1 (nº de filas):5
Se muestran solo las filas de la A2 a la A7. de la A8 a la A26 quedan ocultas.
Alguien me arroja algo de luz??
Gracias por adelantado!

Valentin Prieto Saucedo dijo...

Estimado si quiero ocultar las filas que no sean multiples de 10, es decir solo deben mostrarse las filas que son multiples de 10.