3 intentos de contraseña para abrir un archivo de Excel y no poder usar si las macros están deshabilitadas
En este tutorial armaremos un archivo de Excel que sólo podrá usarse si ingresamos una contraseña. En caso de ingresar una contraseña erróneamente en 3 ocasiones, el archivo se cerrará. Además, si el archivo se abre con las macros deshabilitadas, entonces se mostrará sólo una hoja informándonos que debemos usarlo con las macros habilitadas.
Ver video 3 intentos para abrir archivo de Excel
Suscríbete al canal de EXCELeINFO en YouTube para aprender más de Excel y macros.
Primeros pasos
La Hoja1 será la hoja principal del archivo y la Hoja2 será la hoja donde se mostrarán instrucciones para usar el archivo. Lo primero que debemos hacer es bloquear algunos elementos para no usar el archivo en caso de que las macros estén deshabilitadas:
-
En la pestaña Revisar elegimos Proteger libro. Marcamos Estructura y asignamos una contraseña.
-
Entramos al IDE de VBA usando la combinación [Alt] + [F11].
-
Elegimos la Hoja1 y en la ventana propiedades elegimos la propiedad Visible y elegimos el valor xlSheetVeryHidden.
Figura 1. La Hoja1 es la hoja principal. La Hoja2 es la hoja que se mostrará si las macros están deshabilitadas.
Hasta este punto es importante Guardar el archivo y que se mantengan los cambios que hemos realizado en el archivo.
Diseñamos el formulario
Figura 2. Diseñamos el formulario en el IDE de VBA que nos pedirá la contraseña.
Usaremos el evento Initialize para asignar el carácter del asterisco como el carácter que se mostrará en lugar de los caracteres que se ingresan. El carácter asterisco lo usaremos en la propiedad PasswordChar.
'EXCELeINFO 'MVP Sergio Alejandro Campos 'http://www.exceleinfo.com 'https://www.youtube.com/user/sergioacamposh 'http://blogs.itpro.es/exceleinfo 'http://www.exceleinfo.com/uso-de-colores-en-excel-con-macros/ ' 'Al iniciar el formulario Private Sub UserForm_Initialize() Me.TextBox1.PasswordChar = "*" End Sub
Ahora usaremos el evento QueryClose para mostrar un mensaje cada vez que intentemos cerrar el formulario sin ingresar contraseña. Anularemos la acción de cerrado del formulario asignando True al argumento Cancel.
'Al presionar la X del formulario Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = vbFormControlMenu Then Cancel = True MsgBox "Por favor, ingresa una contraseña.", vbInformation, "EXCELeINFO" End If End Sub
Figura 3. Se muestra el mensaje al intentar cerrar el formulario sin ingresar contraseña.
Al presionar el botón, se validará que la contraseña sea igual a 1234, en todo caso se mostrará un mensaje indicando cuántos intentos de contraseña llevamos. En caso de ingresar la contraseña erróneamente en 3 ocasiones, se cerrará el formulario.
'Al presionar el botón Aceptar Private Sub CommandButton1_Click() Static Intentos As Integer Dim Password As String: Password = "1234" If Me.TextBox1.Value = Password Then ThisWorkbook.Unprotect Password:=5 MsgBox "Bienvenido.", vbInformation, "EXCELeINFO" Sheets("Hoja1").Visible = xlSheetVisible Sheets("Hoja2").Visible = xlSheetVeryHidden Unload Me Else Intentos = Intentos + 1 MsgBox "Llevas " & Intentos Me.TextBox1.SetFocus Me.TextBox1.Value = "" End If If Intentos = 3 Then MsgBox "3 intentos. El archivo se cerrará.", vbInformation, "EXCELeINFO" Unload Me ThisWorkbook.Close SaveChanges:=False End If End Sub
Figura 4. Al ingresar un password incorrecto se mostrará el número e intentos que llevamos.
Ahora usaremos el evento Open del archivo para proteger la estructura. Al proteger la estructura del archivo estamos prohibiendo insertar o eliminar hojas.
'Al abrir el archivo Private Sub Workbook_Open() ActiveWorkbook.Protect Password:=5, Structure:=True frmPassword.Show End Sub
Al abrir el archivo, si el usuario no habilita las macros en el archivo, no podrá usar el archivo. Por eso es importante habilitar el contenido y/o habilitar las macros.
Figura 5. Para poder usar el archivo será necesario que las macros estén habilitadas.
Al final usaremos el evento BeforeClose, o antes de cerrar, para que cuando cerremos el archivo mostramos la Hoja2, ocultamos la Hoja1 y protegemos la estructura del archivo.
'Antes de cerrar el archivo Private Sub Workbook_BeforeClose(Cancel As Boolean) Sheets("Hoja2").Visible = xlSheetVisible Sheets("Hoja1").Visible = xlSheetVeryHidden ActiveWorkbook.Protect Password:=5, Structure:=True ActiveWorkbook.Close SaveChanges:=True End Sub