Problema con el acceso de multiusuarios en libro compartido de excel

Hola a todos, me surgió un problema mientras realizaba un archivo de multiusuarios compartido en red.

resulta que al ingresar al libro pide usuario y contraseña, pero los usuarios que entran tienen distintos privilegios y límites.

por ejemplo el administrador puede ver todos los botones desbloqueados, pero los demás no, 

cuando se inicia el userform, detecta que usuario es de acuerdo a una celda especifica que lo dice cuando entras, pero cuando hay un usuario ya dentro del archivo y entra el administrador, el usuario pasa a tener todos los privilegios.

Quisiera ver la forma de que el status de cada usuario pueda realizarse por código en vez de asociarse a una celda, y que este pueda conservarse para abrir otro userform dentro del mismo.

1 Respuesta

Respuesta
1

Se me ocurre lo siguiente, puedes utilizar 2 celdas, una celda para el administrador y otra celda para el usuario. O que cada usuario tenga su celda. Para modificar el código para que las validaciones queden en el mismo código o en celdas, tendría que revisarlo para ver cómo trabaja.

Si gustas envíame tu archivo y me explicas cómo debo ingresar.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “Philidor valdivia” y el título de esta pregunta.

En tu userform1, comenté estas líneas:

Private Sub UserForm_Initialize()
'If Sheets("logs").Range("H1") = "Admin" Then
'UserForm1.CommandButton2.Enabled = True
'UserForm1.CommandButton4.Enabled = True'
'End If
End Sub

En el userform usuario, el código quedó así:

Private Sub btn_Registrar_Click()
    Dim usuario As String
    Dim Fila, final As Integer
    Dim password, UsuarioEncontrado, yaExiste, Status
    Dim Rango As Range
    Titulo = "Custodia de Talonarios"
    yaExiste = Application.WorksheetFunction.CountIf(Hoja6.Range("Tabla1[Usuario]"), Me.txtUsuario.Value)
    Set Rango = Hoja6.Range("Tabla1[Usuario]")
    If Me.txtUsuario.Value = "" Or Me.txtPassword.Value = "" Then
        MsgBox "Introduce usuario y contraseña", vbExclamation, Titulo
        Me.txtUsuario.SetFocus
    ElseIf yaExiste = 0 Then
        MsgBox "El usuario '" & Me.txtUsuario & "' no existe", vbExclamation, Titulo
    ElseIf yaExiste = 1 Then
        UsuarioEncontrado = Rango.Find(What:=Me.txtUsuario.Value, MatchCase:=False).Address
        password = Hoja6.Range(UsuarioEncontrado).Offset(0, 1).Value
        Status = Hoja6.Range(UsuarioEncontrado).Offset(0, 2).Value
        If Hoja6.Range(UsuarioEncontrado).Value = Me.txtUsuario.Value And password = Me.txtPassword.Value Then
            For Fila = 1 To 1000
                If Hoja8.Cells(Fila, 1) = "" Then
                    final = Fila
                    Exit For
                End If
            Next
            Hoja8.Cells(final, 1) = "=NOW()"
            Hoja8.Cells(final, 1).Copy
            Hoja8.Cells(final, 1).PasteSpecial Paste:=xlPasteValues
            Application.CutCopyMode = False
            Hoja8.Cells(final, 2) = Me.txtUsuario
            Hoja8.Cells(final, 3) = Status
            'Act.Por.Dante Amor
            'Deshabilita todos los botones
            For i = 4 To Hoja6.Cells(1, Columns.Count).End(xlToLeft).Column
                nombreboton = Hoja6.Cells(1, i)
                UserForm1.Controls(nombreboton).Enabled = False
            Next
            r = Hoja6.Range(UsuarioEncontrado).Row
            'habilita botones por usuario
            For i = 4 To Hoja6.Cells(1, Columns.Count).End(xlToLeft).Column
                If Hoja6.Cells(r, i) <> "" Then
                    nombreboton = Hoja6.Cells(1, i)
                    UserForm1.Controls(nombreboton).Enabled = True
                End If
            Next
            'Act.Por.Dante Amor
            '
            Hoja8.Range("G1") = Me.txtUsuario
            Hoja8.Range("H1") = Status
            Unload Me
            ThisWorkbook.Save
            UserForm1.Show
        Else
            MsgBox "La contraseña es incorrecta", vbExclamation, Titulo
        End If
    End If
End Sub

El código que agregué está en donde dice: Act.Por.Dante Amor


En la hoja "Login" tienes que agregar una columna para cada botón, de esta forma, puedes configurar cada botón para cada usuario.

Saludos. Dante Amor

Si es lo que necesitas.

Dante, no me quedó muy claro el código, me podrías ayudar para saber que es lo que hace?.

¿Pero probaste el funcionamiento?

Esto es lo que yo puse:

'Deshabilita todos los botones
            For i = 4 To Hoja6.Cells(1, Columns.Count).End(xlToLeft).Column
                nombreboton = Hoja6.Cells(1, i)
                UserForm1.Controls(nombreboton).Enabled = False
            Next
            r = Hoja6.Range(UsuarioEncontrado).Row
            'habilita botones por usuario
            For i = 4 To Hoja6.Cells(1, Columns.Count).End(xlToLeft).Column
                If Hoja6.Cells(r, i) <> "" Then
                    nombreboton = Hoja6.Cells(1, i)
                    UserForm1.Controls(nombreboton).Enabled = True
                End If
            Next
            'Act.Por.Dante Amor

Primero, lo que hace es poner todos los botones del userform1 como enabled = false (deshabilitados), el nombre del botón está en la fila 1 de la hoja Login.

Segundo, obtiene el número de fila del usuario que entró al sistema:

r = Hoja6.Range(UsuarioEncontrado).Row

Por último, con ese número de fila revisa a cuáles botones tiene acceso el usuario, si en la celda tiene una "x" quiere decir que tiene acceso a ese botón, entonces toma el nombre del botón del encabezado y habilita (UserForm1. Controls(nombreboton).Enabled = True)

Ejemplo:

Si entras con el usuario dam

Lo que hace la macro es obtener el número de fila del usuario dam:

r = Hoja6.Range(UsuarioEncontrado).Row

Ya que tiene el número de fila

Para cada uno de los botones que tienes en la fila1, en este caso tienes 3 botones, commadbutton1 2 y 3, si te fijas en la hoja login en la fila1 están los nombres de tus botones.

La macro pregunta si la fila4, columna "D" es diferente de blanco.

En la imagen puedes ver que en la fila 4, columna "D" hay una "x", esa "x" se debe poner antes de ejecutar la macro, es la configuración de cada usuario.

Como la celda es diferente de blanco, entonces ese botón se desactiva, ¿cuál botón? El que se encuentra en la columna "D" fila1 (commandbutton1), la macro toma el nombre de la fila1 columna "D" y lo desactiva

nombreboton = Hoja6.Cells(1, i)
UserForm1.Controls(nombreboton).Enabled = True

Y así para cada botón.

Espero que con el ejemplo haya quedado más claro. Ya no es necesario que pongas el nombre de usuario en la hoja logs celda G1 y H1. Ya que cada vez que alguien entre, los commandbutton se activarán de acuerdo a la configuración de la hoja login.

Saludos. Dante Amor

Recuerda valorar la respuesta.

Dante, es un sistema muy bueno, ya lo probé y funciona. 

Tengo un problema con el procedimiento, cuando entras como usuario, ves el primer UserForm con los botones que se definieron en las columnas según el código, pero al ingresar al segundo UserForm de consulta y luego devolverte con el botón atrás, todos los botones vuelven a su estado original, es decir, solo funciona el código la primera vez que inicias el UserForm.

Tienes que revisar cuándo ocupar Unload Me o cuándo ocupar hide.

Lo que estabas haciendo era cerrar el formulario1 y cuando lo cargabas nuevamente los botones perdían la propiedad.

En el código de tu userform1 cambié esta parte:

Private Sub CommandButton1_Click()
    'Unload Me
    UserForm1. Hide
    UserForm2.Show
End Sub
Private Sub CommandButton2_Click()
    UserForm1.Hide
    UserForm3.Show
End Sub

También comenté estas líneas

'Application.ScreenUpdating = False

Si cierras el formulario, pero tienes apagado la actualización de pantalla, entonces el formulario parece que todavía está activo.

Saludos. Dante Amor

Después del breviario, espero que puedas valorar la respuesta y crees las preguntas adicionales para el manejo de formularios. (Jeje)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas