Macro para ver hojas

Que tal fejoal, un gusto volver a saludarte. Quisiera que me echaras la mano para lo siguiente: Tengo una hoja en donde tengo botones para pasar a otras hojas, pero necesito restringir el acceso a las otras hojas, lo que necesito es que, al presionar el botón para cambiar a una hoja, me pregunte una contraseña, de lo contrario no tenga manera de ver esa hoja. A ver si me puedes echar la mano. De antemano gracias.

1 respuesta

Respuesta
1
Vamos a decir, primero, que MS Excel no dedica muchos recursos a ser inexpugnable. Cuenta con algún nivel de seguridad pero es absolutamente vulnerable.
Lo que intentaremos hacer es diseñar inteligentemente el archivo para que el usuario medio encuentre obstáculos para salirse del procedimiento que le indiques.
Así, empezaremos por agregar una hoja en blanco a la cual le colocaremos un mensaje y tus botones de acceso a otras hojas. El resto de las hojas deberán ocultarse y, luego, asegurarnos de que permanezcan así.
Adicionalmente, usaremos la protección de libro con una clave compleja.
De esta manera al abrir el archivo esta será la única hoja visible, siendo necesaria esa contraseña para poder acceder al resto del libro.
Esta solución funciona sobre la base de macros de VBA. Por tanto, es imprescindible que el usuario no las inhabilite al abrir el archivo.
En caso de que lo haga, se encontrará con una sólo hoja disponible, avisándole que, para que funcione debe habilitar macros. Como el libro cuenta con una protección, no le será posible ver el resto de las hojas ocultas, a menos que conozca la clave de libro (por ejemplo: PIRULO).
Notarás que usaremos varias contraseñas en este libro, según cada función. La de Libro que mencioné recién está incluida en el mismo código de la macro.
Las contraseñas que deberán ingresar los usuarios para acceder a las hojas ocultas, también están guardadas en el procedimiento de Visual Basic.
Por ello, juzgué conveniente que todo el proyecto de VBA estuviese también protegido para que el usuario no pueda leer el código y, eventualmente, descubrir dónde se alojan las contraseñas. Busca otra contraseña compleja para el código de visual basic y protege el proyecto.
(Para esto: Una vez que hayas completado las modificacionesa las macros en el Editor de Visual Basic, en su Navegador de Proyectos, busca el proyecto de éste archivo -cierra todos los elementos que tenga asociado- haz click derecho sobre él. Elige "Propiedades del VBA Project". Selecciona la solapa de Protección, marca la casilla de "Bloquear proyecto para visualización" y también ingresa otra contraseña aquí)
Al presionar el botón para ir a determinada hoja, aparecerá la ventana donde le solicita la clave.
Si fuera correcta, la macro desprotegerá el libro, mostrará la hoja y volverá a proteger el libro.
Estas son las macros que hacen tal rutina:
Sub AhojaX()
'Fer, cambia aquí las variables para cada hoja:
ActiveHoja = "Hoja2"
AccedeCon = "ClaveHoja2" 'Aquí coloca la clave asignada a esa hoja
Call Tomaclave(AccedeCon, ActiveHoja)
End Sub
Sub Tomaclave(ClaveX, HojaX)
88: Beep
LaClave = InputBox("Ingrese su clave para ir a hoja " & HojaX, "Su Clave")
If LaClave = ClaveX Then
ActiveWorkbook.Unprotect "PIRULO"
Sheets(HojaX).Visible = True
Sheets(HojaX).Activate
ActiveWorkbook.Protect "PIRULO"
Else
For ton = 1 To 4
Beep
Next ton
QueHago = MsgBox("La clave ingresada es incorrecta o nula", vbRetryCancel, "ERROR de CLAVE")
If QueHago = vbRetry Then GoTo 88
End If
End Sub
Public Sub AlGrabar() 'viene del evento Before_Save
Dim HojasVis() As Variant
Application.EnableCancelKey = xlDisabled
ActiveWorkbook.Unprotect "PIRULO"
Application.ScreenUpdating = False
Sheets("NOTA").Visible = True
Sheets("NOTA").Select
HojaV = 0
'Oculta líneas
For Each SHT In Sheets
If SHT.Name <> "NOTA" And SHT.Visible Then
SHT.Visible = False
ReDim Preserve HojasVis(HojaV)
HojasVis(HojaV) = SHT.Name
HojaV = HojaV + 1
End If
Next SHT
ActiveWorkbook.Protect "PIRULO"
Application.DisplayAlerts = True
Application.EnableEvents = False
ThisWorkbook.Save
ActiveWorkbook.Unprotect "PIRULO"
For SHT = 0 To UBound(HojasVis) ' - 1
Sheets(HojasVis(SHT)).Visible = True
Next SHT
ActiveWorkbook.Protect "PIRULO"
Application.EnableEvents = True
End Sub
Desconozco cómo es la estructura de tu proyecto pero asumiré que tienes un botón para cada hoja. Por lo tanto tendrás que tener una macro como AhojaX() por cada botón, obicamente reemplazando los datos de nombre hoja y clave por sus correspondientes.
La macro Tomaclave() es común a todas las hojas, por lo tanto no es necesario replicarla para todas las hojas.
Notarás también una tercera macro: AlGrabar()
Vinculada a un tema adicional de seguridad: Grabado y cierre de archivo.
Esta macro necesita además que incluyas en la hoja "Thisworkbook" ("EsteLibro" en algunas versiones) las siguientes sentencias:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
'llamado a macro de salida
Call AlGrabar
ActiveWorkbook.Saved = True
Cancel = True
End Sub
Bien, ésta es macro auxiliar que se activa con el evento Before_Save, es decir antes de grabar.
Con el objeto de evitar que, al grabar, el archivo quede con hojas visibles, esta macro toma el control del proceso de grabación.
En los otros casos, ocultará todas las hojas menos la inicial (NOTA), protegerá el libro y lo grabará. Luego muestra todas las hojas que estaban visibles para poder seguir trabajando. De esta manera, nos aseguramos que la versión guardada en disco siempre tenga todas las hojas ocultas.
Bueno, chavo, menuda pregunta enviaste. Espero no haberte confundido, al menos, no demasiado. Pero si sigues los pasos indicados llegarás a lo que solicitabas.
Ojala te sirva.
En tal caso, ya sabes qué hacer ;)
Un abrazo!
Fernando

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas