Mostrar varias hojas en Excel dependiendo del usuario ingresado en un Formulario VBA
En un tutorial anterior vimos cómo Mostrar una hoja de Excel dependiendo el usuario y contraseña ingresados. En los comentarios de Youtube recibí una pregunta que se repitió en varias ocasiones, y esa pregunta es Cómo podemos hacerle para asignarle diferentes hojas a mostrar a cada usuario.
Es por eso que decidí modificar el archivo para cambiarle la lógica a la macro VBA y ahora poder definir cuál o cuáles hojas se podrán mostrar por usuario logueado en nuestro archivo de Microsoft Excel.
Tabla de usuarios, contraseñas y hojas
Tenemos una Tabla en Excel donde almacenamos los valores de NOMBRE USUARIO, USUARIO, PASSWORD, HOJAS. Se tiene una columna por cada hoja que haya en nuestro archivo de Excel. Si observamos en la Figura 1, cada columna correspondiente a cada hoja tiene especificado SI o No. Eso significa que indicaremos por cada usuario, qué hojas tendrá visibles al introducir sus datos de login y contraseña.
Figura 1. Matriz de usuarios y nombres de hojas para mostrar las que serán visibles por usuario.
Ver video Mostrar varias hojas por usuario
Suscríbete al canal de EXCELeINFO en YouTube para aprender más de Excel y macros.
Ingresando credenciales de usuario en Formulario VBA
Usaremos el mismo Formulario que diseñamos para introducir las credenciales del usuario. Al dar clic en Aceptar se mostrarán las hojas que previamente hayamos definido como visibles para el usuario.
Figura 2. Ingresamos las credenciales de un usuario para mostrar las hojas permitidas.
Entendiendo la lógica del archivo y las macros VBA
Ocultar hojas al abrir y cerrar el archivo
Haciendo uso de los eventos Abrir (Open) y Antes de cerrar (BeforeClose), vamos a mandar llamar a un procedimiento llamado OcultarHojas que al ejecutarse se ocultarán todas las hojas del archivo exceptuando la hoja llamada Principal. Hay que notar que las hojas tendrán la propiedad SheetVeryHidden que significa que no podrán ser mostrar al dar clic derecho en la etiqueta de las hojas.
Las siguientes macros van en 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_BeforeClose(Cancel As Boolean) Call OcultarHojas ThisWorkbook.Save End Sub Private Sub Workbook_Open() Call OcultarHojas UserForm1.Show vbModal = True End Sub
La macro OcultarHojas irá en un Módulo normal.
Option Explicit ' 'EXCELeINFO 'MVP Sergio Alejandro Campos 'http://www.exceleinfo.com 'https://www.youtube.com/user/sergioacamposh 'http://blogs.itpro.es/exceleinfo ' 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
Cómo trabaja el formulario y sus macros VBA
Al iniciar el Formulario se ocultarán todas las hojas exceptuando la hoja Principal. Al dar clic en el botón Validar se comprobará que el usuario exista y posteriormente que la contraseña sea la asignada a ese usuario.
Usaremos un ciclo For Next para recorrer las columnas en la Tabla de usuario y por cada celda encontremos el valor de SI, se irán mostrando las hojas correspondientes al usuario ingresado.
A continuación del código 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 ' 'Al iniciar el formulario 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 Dim Fila As Integer Dim i As Integer Dim MostrarHoja As String UsuarioExistente = Application.WorksheetFunction.CountIf(Sheets("Usuarios2").Range("B:B"), Me.txtUsuario.Value) Set Rango = Sheets("Usuarios2").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(Usuarios2.Range(DatoEncontrado).Offset(0, 1).Value) 'Si el usuario y la contraseña coinciden... If LCase(CStr(Usuarios2.Range(DatoEncontrado).Value)) = LCase(Me.txtUsuario.Value) And Contrasenia = _ Me.txtPassword.Value Then Call OcultarHojas ''''''''''''''''''''''''''''''''''''''''''''' 'Mostrar las hojas donde esté la palabra SI en la hoja Usuarios2 Fila = Sheets("usuarios2").Range(DatoEncontrado).Row For i = 1 To 12 HojaVisible = Usuarios2.Range(DatoEncontrado).Offset(-(Fila - 1), i + 1).Value MostrarHoja = Usuarios2.Range(DatoEncontrado).Offset(0, i + 1).Value If MostrarHoja = "SI" Then Sheets(HojaVisible).Visible = True Next i ''''''''''''''''''''''''''''''''''''''''''''' Unload Me Else MsgBox "La contraseña es inválida", vbExclamation, "EXCELeINFO" End If End If End Sub
Descarga el archivo de ejemplo
Formulario de Usuario y contraseña para mostrar hoja por usuario – 2 – 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.