Mostrar hoja dependiendo del usuario y contraseña ingresados en un Formulario de Excel vba
En un tutorial anterior vimos cómo validar los datos de usuario y contraseña en un Formulario de Excel vba. En este tutorial usaremos el mismo archivo de ejemplo, pero haciéndole algunas modificaciones para hacerlo más funcional. Una de las modificaciones es asignarle una hoja de trabajo a cada usuario, permitiendo así que dependiendo el usuario que ingreses, sea la hoja que se mostrará. Si tu usuario es de nivel Administrador, entonces podrás visualizar todas las hojas, incluso la hoja de usuarios y contraseñas.
Otra de las modificaciones que le hicimos es que cada vez que el archivo se abre, se muestra el formulario para ingresar el usuario y la contraseña. Además de que al cerrar el archivo, se ocultarán todas las hojas, excepto la principal, y se guardará el archivo automáticamente.
Tabla de usuarios y contraseñas
Tenemos una hoja llamada Usuarios donde tendremos una tabla que contendrá los datos de NOMBRE, USUARIO, CONTRASEÑA y HOJA. En la columna HOJA irá el nombre de la hoja que será mostrará a cada usuario. Si nos fijamos en la Figura 1 vemos que en la columna HOJA tenemos la palabra TODAS; esto quiere decir que el usuario ADMIN podrá visualizar todas las hojas.
Figura 1. Tabla de usuarios y contraseñas.
Ver video Mostrar hoja dependiendo del usuario y la contraseña
Suscríbete al canal de EXCELeINFO en YouTube para aprender más de Excel y macros.
Ejecutar macros al abrir y cerrar el archivo (Eventos VBA)
Al abrir el archivo llamaremos a una macro llamada OcultarHojas que se ejecutaré en el evento Workbook_Open para ocultar todas las hojas del archivo y mostraremos el formulario para ingresar los datos de acceso. La macro la encontraremos el el objeto ThisWorkbook.
'EXCELeINFO 'MVP Sergio Alejandro Campos 'http://www.exceleinfo.com 'https://www.youtube.com/user/sergioacamposh 'http://blogs.itpro.es/exceleinfo Private Sub Workbook_Open() Call OcultarHojas UserForm1.Show End Sub
La macro OcultarHojas las podremos encontrar en el Módulo2.
Sub OcultarHojas() Dim Hoja As Object For Each Hoja In ActiveWorkbook.Sheets If Hoja.Name = "Principal" Then Else Hoja.Visible = xlVeryHidden End If Next Hoja End Sub
Al cerrar el archivo, para evitar que las hojas queden visibles, ejecutaremos el evento Workbook_BeforeClose o Antes de cerrar, para ejecutar la macro CerrarHojas y como dice el nombre, ocultaremos todas las hojas del archivo y luego guardaremos el archivo automáticamente.
Private Sub Workbook_BeforeClose(Cancel As Boolean) Call OcultarHojas ThisWorkbook.Save End Sub
Formulario para ingresar usuario y contraseña
El formulario de acceso pedirá el Usuario y Contraseña, y se validará primero que el usuario exista, para luego validar la contraseña. Si el usuario y la contraseña coinciden, se mostrará la hoja correspondiente al usuario. En caso de haber ingresado los datos del usuario ADMIN, entonces todas las hojas se mostrarán.
Figura 2. Formulario de acceso con usuario y contraseña.
Macro VBA del formulario
Option Explicit ' 'EXCELeINFO 'MVP Sergio Alejandro Campos 'http://www.exceleinfo.com 'https://www.youtube.com/user/sergioacamposh 'http://blogs.itpro.es/exceleinfo ' Private Sub UserForm_Initialize() FormDesign.FormDesign 'Call OcultarHojas End Sub 'Botón Cerrar Private Sub CommandButton1_Click() Unload Me End Sub 'Botón Validar Private Sub CommandButton2_Click() Dim usuario As String Dim Contrasenia As Variant Dim HojaVisible As String Dim UsuarioExistente Dim DatoEncontrado Dim Rango As Range UsuarioExistente = Application.WorksheetFunction.CountIf(Sheets("Usuarios").Range("B:B"), Me.txtUsuario.Value) Set Rango = Sheets("Usuarios").Range("B:B") 'Validamos que se hayan introducido valores. If Me.txtUsuario.Value = "" Or Me.txtPassword.Value = "" Then MsgBox "Por favor introduce usuario y contraseña", vbExclamation, "EXCELeINFO" Me.txtUsuario.SetFocus 'Se valida que el usuario exista en la tabla. ElseIf UsuarioExistente = 0 Then MsgBox "El usuario '" & Me.txtUsuario & "' no existe", vbExclamation, "EXCELeINFO" 'En caso de que el usuario exista, validamos su contraseña. ElseIf UsuarioExistente = 1 Then DatoEncontrado = Rango.Find(What:=Me.txtUsuario.Value, MatchCase:=False, LookAt:=xlWhole).Address Contrasenia = CStr(Usuarios.Range(DatoEncontrado).Offset(0, 1).Value) 'Si el usuario y la contraseña coinciden... If LCase(CStr(Usuarios.Range(DatoEncontrado).Value)) = LCase(Me.txtUsuario.Value) And Contrasenia = _ Me.txtPassword.Value Then 'Range("G2").Value = "Usuario: " & Usuarios.Range(DatoEncontrado).Offset(0, -1).Value ''''''''''''''''''''''''''''''''''''''''''''''' HojaVisible = Usuarios.Range(DatoEncontrado).Offset(0, 2).Value If HojaVisible = "TODAS" Then Call MostrarHojas Else Call OcultarHojas ThisWorkbook.Sheets(HojaVisible).Visible = True End If ''''''''''''''''''''''''''''''''''''''''''''''' 'Aquí va el código para dar acceso a todo lo que el programador decida Unload Me Else MsgBox "La contraseña es inválida", vbExclamation, "EXCELeINFO" End If End If End Sub
La siguiente macro nos ayudará a mostrar todas las hojas en caso de que hayamos ingresado con el usuario ADMIN.
Sub MostrarHojas() Dim Hoja As Object Application.ScreenUpdating = False For Each Hoja In ActiveWorkbook.Sheets If Hoja.Name = "Principal" Then Else Hoja.Visible = True End If Next Hoja Application.ScreenUpdating = True End Sub
Diseño minimalista del formulario
Al ejecutar el formulario se ejecutará la macro FormDesign para darle un diseño minimalista al formulario. Para ver cómo funciona la macro FormDesign puedes visitar este video.
Descarga el archivo de ejemplo
Formulario de Usuario y contraseña para mostrar hoja por usuario – EXCELeINFO.zip
Si te gustó este tutorial por favor regístrate en nuestra Lista de correo y Suscríbete a nuestro canal de YouTube para que estés siempre enterado de lo nuevo que publicamos.