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

Mostrar y ocultar hojas, utilizando macros

En otras entregas, habíamos visto como proteger un libro de excel mediante la solicitud de un password, a través de un Inputbox, como proteger y desproteger hojas de cálculo sin macros, y como proteger y desproteger hojas de cálculo con macros. Hoy nos centraremos en como mostrar u ocultar hojas de cálculo, si se introduce correctamente o no, la contraseña solicitada.

Para usar el ejemplo de hoy, podíamos haber diseñado un Userform bien bonito, donde se le pidiera al usuario un password cada vez que quiere acceder a una hoja de cálculo determinada, pero para simplificarlo, he optado por utilizar un Inputbox, que nos hará las mismas funciones, con menos código, y con menos trabajo de “diseño”.

En este artículo, he incluido dos formas diferentes para proteger una hoja de cálculo. En el primer caso, el más sencillo, consiste en que cada vez que el usuario accede a la protegida (en el ejemplo, la Hoja2), se le presenta un Inputbox, solicitando una contraseña. Si el usuario no introduce ninguna contraseña, o introduce una contraseña incorrecta, el usuario es redirigido a la primera hoja (en nuestro caso, a la Hoja1). A través de este método de protección, el usuario ve parte del contenido de la Hoja2 (el Inputbox aparece en primer plano, delante del contenido de la Hoja2), pues ha accedido a ella, …solo que si quiere interactuar con la misma (ver todo el contenido, cambiar datos, imprimir, etc.), deberá introducir el password correcto.

El segundo caso, mucho más elegante, consiste en tener la hoja oculta (en nuestro caso, la Hoja3), y cada vez que queramos acceder a ella, se nos pida un password. En caso de no introducirlo, de introducirlo de forma incorrecta, no podremos acceder a la hoja. En el caso de introducir el password correcto, se mostrará la hoja de cálculo al usuario.


Para el primer método de protección, nos bastará con copiar y pegar este código en la Hoja2, desde VBA (no hay que copiarlo en un módulo, sino en la Hoja2):


Private Sub Worksheet_Activate()
'Este mensaje aparecerá cada vez que
'accedamos a la Hoja2

respuesta = InputBox("Introduce el password", "Password")
'si la respuesta introducida es distinta de "tariro-tariro"
'devolvemos al usuario a la Hoja1 (ojo, Hoja1 es el nombre
'interno de VBA, no el nombre visible de la pestaña)

If LCase(respuesta) <> "tariro-tariro" Then
'Vamos a la Hoja1
Hoja1.Activate
End If
End Sub

Para el segundo método de protección, deberemos copiar y pegar dos macros en un módulo VBA. El primero consiste en ocultar de forma muy estricta, la Hoja3, cada vez que abramos el fichero de excel, para lo cual crearemos el macro llamado Auto_open():

Sub Auto_open()
'Ocultamos la Hoja3
Hoja3.Visible = xlSheetVeryHidden
End Sub

El otro macro que tendremos que copiar es este que os incluyo a continuación (hay que copiarlo en un módulo). El macro está pensado para asociarlo a un botón, para que se ejecute, y que nos pida el password, y su funcionamiento, como veréis al leer el código fuente, que está comentado, es realmente sencillo:

Sub Ir_a_la_hoja3()
'Este mensaje aparecerá cada vez que
'accedamos a la Hoja3

respuesta = InputBox("Introduce el password", "Password")
'si la respuesta introducida es distinta de "tariro-tariro"
'devolvemos al usuario a la Hoja1 (ojo, Hoja3 es el nombre
'interno de VBA, no el nombre visible de la pestaña)

If LCase(respuesta) <> "tariro-tariro" Then
'Vamos a la Hoja1
Hoja1.Activate
'Ocultamos la Hoja3
Hoja3.Visible = xlSheetVeryHidden
Else
'Mostramos la Hoja3
Hoja3.Visible = True
'Vamos a la Hoja3
Hoja3.Activate
End If
End Sub

Como complemento, en el fichero que os podéis descargar y que contiene todo este código, se incluye un tercer macro, que sirve para asociar el primer método de protección a un botón (el método que nos presenta el Inputbox, al acceder a la Hoja2):

Sub Ir_a_la_hoja2()
'Vamos a la Hoja2
Hoja2.Select
End Sub

Evidentemente, como siempre que hagamos un macro, deberemos proteger con un password, el módulo VBA, para salvaguardarlo de los curiosos. Desde aquí podéis descargar el fichero de excel, con el ejemplo que os presento en este artículo.



22 comentarios:

VALENTIN dijo...

Enhorabuena por los artículos publicados. Gracias por compartir con nosotros estos temas de excel.
No puedo descargar los archivos adjuntos ni los artículos publicados.
¿cómo es posible?.
Gracias

Javier Marco dijo...

Gracias por tus comentarios. Deberías poder descargar los ficheros de megaupload, a no ser que tengas restringida la navegación por determinados sitios web. En megaupload, debes introducir los 3 caracteres alfabéticos que te aparecerán arriba a la derecha.

Respecto a los artículos, puedes descargarlos pegándolos en word, por ejemplo.

Un saludo.

RjveraL dijo...

Genial... sinceramente genialll... me gustaron mucho los artículos... he leído varios hasta la fecha...

Tengo una Duda... tal vez tu me puedas ayudar...
1.- Como hacer para que un excel no me muestre ni las pestanas de hojas ni los menues... la cosa es algo asi para que el usuario simplemente ingrese y no pueda modificar ni ver las otras cosas... y tambien qwue no se vea que existen otras hojas ni ocultas ni nada y que no aparesca la opcion de pestañas abajo... yo lo he visto en tus ejemplos pero no se como se hace.
Rj

RjveraL dijo...

Hola de nuevo... sabes tengo una duda en cuanto a excel... es que estoy trabajando en una planilla y tal vez tu me puedas ayudar para hacerla más rapido ... quizas me des algunos link para no tomar tanto tiempo y me ayudes de esa forma... yo puedo seguir de ese punto... mira te cuento.
Tengo una Tabla que posee información que debo extrar para hacer otras tablas...
Explico:
Tabla Origen Contien:
Item
Fecha
Nombre
Tipo 1
Tipo 2
Tipo 3

Generarar Tabla (1-3)con:
Nombre No repetido (Según el Tipo)
Fecha de un mes (del 1 al 31)
Tipo 1: agregado a la fecha según tabla principal y según el usuario

(Nombre), es decir, de una tabla de datos,Mostrar un resumen de tipo por día de cada Usuario

Se puede que formulas debo usar para hacer esto o ya es cosa de mucho atao.
Rj.

Mira por siaca...
Subí un ejemplo para tener una idea mejor...
http://www.megaupload.com/es/?d=O9K7I56V

Muchas gracias

Rj

Javier Marco dijo...

Hola RJVeraL...

No te recomendaría que quitases la barra de menús, ni que dejases que el usuario no viese las pestañas, porque al final, el usuario sin mucho esfuerzo, puede volver a mostrar todo eso. Hay otros mecanismos, como por ejemplo ocultando las hojas (las pestañas) con una contraseña (cosa que también está explicada en una de las últimas entradas del blog. Aparte, hay muchos usuarios a los que no les gusta que le restrinjan las opciones que por defecto muestra Excel.

Para hacer lo que preguntas, deberías utilizar algún macro para ahorrarte trabajo. Es bastante largo prepararlo, y veo que en VBA no estás muy puesto. Por eso te recomendaría que consultases algún manual de macros para excel (buscando en google, encontrarás uno en pdf). Una vez tengas las bases, podrás meterte con un trabajo como ese, que no es complicado, pero sí requiere su tiempo.

También podrías mirar las "tablas dinámicas" de excel (en la ayuda de excel, o en google, obtendrás más información), por si te pueden servir para ese propósito.

Un saludo.

Antonio dijo...

Estaba recorriendo la Web en busca de algunas ayudas para Excel y me tope con este Blog. Excelente, muy didáctico. Pero tengo una inquietud: ¿Tiene algún link donde se publiquen los ejemplos? ¿Cómo hago para descargarlos? Felicitaciones a su autor.

_______________________________________
Un saludo desde Barranquilla, la Puerta de Oro de Colombia

Javier Marco dijo...

Gracias por tu comentario, Antonio.

Pues sí, puedes descargar los ejemplos. En algunos artículos no hay ejemplos, pero en otros sí. Para localizarlos, baja hasta el final de cada artículo, y allí localizarás los ejemplos (hay un enlace de descarga). El enlace te manda a megaupload (un servicio de alojamiento de ficheros). Tan solo deberás introducir los 3 caracteres alfabéticos que te aparezcan arriba a la derecha, y esperar el contador de descarga que te aparecerá. l final te aparecerá un botón que al pulsarlo, te permitirá descargar el fichero.

Saludos.

Cristian dijo...

Hola.. he verificado la macro y me da un error, "Hoja3.Visible = True"...
Lo puedes verificar ????
Gracias y esta rebueno el blog...

Javier Marco dijo...

Pues lo acabo de probar, y funciona perfectamente. Es más, ese fue el fichero con el que trabajé y donde monté ese ejemplo, así que debería funcionar correctamente.

Si lo estás aplicando sobre ese mismo archivo, tiene que funcionarte por narices. En cambio, si ese código lo estás aplicando en otras hojas de cálculo tuyas, ten en cuenta que Hoja3, se refiere al nombre interno que tiene la hoja, vista desde el modo VBA (arriba a la izquierda, antes del paréntesis con el nombre de la pestaña visible).

No es lo mismo:
Hoja2.Select

que:
Sheets("Hoja1").Select

En el primer caso, se refiere al nombre interno, visto desde VBA, y en el segundo, entrecomillada, se refiere al nombre que ves en la pestaña.

Mira a ver si tienes eso correctamente.

Saludos y gracias por tu comentario.

Dolfin dijo...

Sencillamente brillantes las macros para contraseñas en hojas. En mi empresa he quedado como un mounstro jeje, Me encanta el mundo de las macros y cada día descubro algo nuevo, La vida es una gran macro. Simplemente quería felicitar al/los autores. Gracias

Javier Marco dijo...

Muchas gracias por tu comentario. Espero que sigas triunfando en la empresa :-)

Fernando dijo...

Hola, quería tener un excel donde según el usuario pudiera ver unas hojas u otras. A partir de tu ejemplo añadiendo un "case" para mostrar y ocultar hojas según el password introducido lo he logrado.
Muchas gracias.

Javier Marco dijo...

Vaya, Fermando... Tengo preparado un artículo para este próximo miércoles (28 de enero) que precisamente versa sobre eso. Parece que me hayas leído el pensamiento.

Bueno, en cualquier caso, como se puede hacer de varias formas, yo te pondré otra opción diferente.

Gracias por tu comentario.

juank dijo...

Hola, cuando ocultas una hoja con una macro el problema que tengo es que si el usuario no habilita las macros la puede ver.. son varios usuarios y cada uno solo puede ver algunas hojas, y eso lo hice fácilmente con VB pero no se que hacer para que si no habilita las macros no vea nada... tiene solución este problema?

Javier Marco dijo...

Pues no, no hay solución. Pero es de suponer que tus macros son tan interesantes, y le facilitan tanto la tarea al usuario, que por narices deben habilitarlos. Si no los habilitan, entonces no podrán sacarle partido a la aplicación que desarrollaste.

juank dijo...

Gracias Javier! Sabes, encontré una interesante combinación entre la propiedad de workbook_BeforeClose y la de Sheets(2).Visible = xlSheetVeryHidden que me garantiza que las hojas no se podrán ver nunca si no se activan las macros.. saludos desde cr

Pedro dijo...

Hola soy Pedro,gracias por sus aportes la verdad hacen la vida mas facil, ahora les pido su apoyo con otro asunto lo que pasa es lo siguiente,nesecito hacer una suma de valores entre un rango de fechas me explico mediante el siguiente ejemplo. supongamos en la celda E5 tenemos una fecha fija con la cual se va a restar y obtener un valor en numero,en la celda E6 Y F7 se insertan dos fechas con las cuales la celda E6 se va a restar con la E5 al igual que la F7 se resta con la E5,c/u de ellas da un numero, ese numero es un valor que se encuentra desde el 1 al 120 y se encuentra el la celda h8 que contiene a el valor nº1,h9 al valor nº2 ,asi sucesivamente hasta al 120. ahora cada uno de esos valores en la celda siguiente osea en la I8 tiene un valor que pertenece a al valor nº1, I9 que pertenece al nº2, hasta el nº120.ejemplo mi fecha fija es el 30/12/09 y en la celda E6 escribimos la fecha 01/01/10; la resta entre (01/01/10)-(30/12/09)=2, y en la celda F6 colocamos la fecha 31/01/10; (31/01/10)-(30/12/09)=32, mi problemas es que si hubiera una forma de que me sume desde el nº2 hasta el nº32 todos los valores que estan en la celda I que corresponde a cada numero, segun la fecha que ingrese. espero que me hayan entendido y q me puedan ayudar.
H I
1 =5
2 =6
3 =6
4 =2

resultado 19
ESPERO SU AYUDA.

Pedro dijo...

Buenos Dias soy Pedro, al paracer nadie tiene una idea de hacer lo que explique, solucione el problema utilizando funciones,pero era trabajoso, pero gracias de todos modos.

moix-Uhx dijo...

Muy buen artículo, a ver si alguien puede ayudarme a conseguir el codigo para mostrar una hoja oculta, iniciar un cronometro automaticamente y cuando llega a un tiempo, digamos a los 10 mins, ocultar automaticamente la hoja.

Se como mostrar y ocultar la hoja pero la parte del cronometro no lo tengo claro, toda ayuda será bienvenida.

Gracias.

Javier Marco dijo...

Hola moix-Uhx.

Copia y pega esto en un módulo:

Sub Auto_open()
'Lanzamos el macro llamado ocultar,
'10 minutos después de ejecutar este Auto_open,
'que es cuando ponemos en marcha el contador de tiempo
Application.OnTime Now + TimeValue("00:10:00"), "ocultar"
End Sub

Sub ocultar()
'si hay errores, que continúe
On Error Resume Next
'ocultamos la hoja llamada VENTAS (es un ejemplo)
Sheets("VENTAS").Visible = xlSheetVeryHidden
End Sub

El macro llamado auto_open se ejecuta al abrir el fichero. En ese momento se pone en marcha un cronómetro, y al cabo de 10 minutos, se ejecutar el macro ocultar. En ese momento se oculta la hoja VENTAS.

Si quieres probarlo, sin esperar 10 minutos, a ver como funciona, cambia los 10 minutos, por 10 segundos, poniendo en lugar de:

00:10:00

esto otro:

00:00:10

Saludos.

Anónimo dijo...

Tengo una conulta al ingresar la clave o password como evitar que se pueda ver la clave, por ejem. se podria ver *.
gracias por la atencion

Javier Marco dijo...

En un inputbox es bastante más complicado de hacer, que en un textbox de un formulario, que es sencillísimo.

Aquí te dejo un sitio donde explican como implementar los asteriscos en un inputbox: http://www.recursosvisualbasic.com.ar/htm/listado-api/137-inputbox-password.htm

Saludos.