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 de fejoal
1
1
fejoal, Por falta de tiempo para responder como me gusta hacerlo suspendo...
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