Home > Excel, Forms, Formularios, vba > Simular acceso con usuario y password en Excel con formulario vba

Simular acceso con usuario y password en Excel con formulario vba

En esta ocasión les comparto un ejemplo donde se simula el acceso a un sistema mediante el ingreso de un Usuario y una Contraseña.

Lo vamos a realizar mendiante un formulario de vba que nos pida y nos valide los siguientes datos:

  1. Que tanto el usuario como la contraseña estén llenos.
  2. Que el usuario ingresado exista en la tabla de usuarios.
  3. Que coincida el usuario ingresado con su contraseña.

Para validar que usuario existe se hace mediante la función COUNT.IF de vba; para elegir al usuario encontrado se hace con el método Find; y por último para validar que el usuario y la contraseña coincidan, se realiza haciendo un Offset de la celda encontrada.

Imagen del formulario de acceso

image

Imagen de la tabla de usuarios

image

Código del formulario

':: By: Sergio Alejandro Campos Hernández
':: Date: marzo de 2012
':: https://exceleinfo.wordpress.com
':: Purpose: simular acceso con usuario y contraseña
'
Private Sub CommandButton2_Click()
Dim usuario As String
Dim password As Variant
Dim DatoEncontrado
Blog = "EXCELeINFO"
UsuarioExistente = Application.WorksheetFunction.CountIf(Range("D3:D12"), _
    Me.txtUsuario.Value)
Set Rango = Range("D3:D12")
If Me.txtUsuario.Value = "" Or Me.txtPassword.Value = "" Then
    MsgBox "Por favor introduce usuario y contraseña", vbExclamation, Blog
    Me.txtUsuario.SetFocus
ElseIf UsuarioExistente = 0 Then
    MsgBox "El usuario '" & Me.txtUsuario & "' no existe", vbExclamation, Blog
ElseIf UsuarioExistente = 1 Then
    DatoEncontrado = Rango.Find(What:=Me.txtUsuario.Value, MatchCase:=True).Address
    Contrasenia = Range(DatoEncontrado).Offset(0, 1).Value
    If Range(DatoEncontrado).Value = Me.txtUsuario.Value And Contrasenia = _
    Me.txtPassword.Value Then
        Range("G2").Value = "Usuario: " & Range(DatoEncontrado).Offset(0, -1).Value
        '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, Blog
    End If
End If
End Sub

:: Descargar el ejemplo

  1. RAMON VAZQUEZ
    April 11, 2012 at 16:35

    te agradezco todas las aportaciones me he convertido en un adicto EMPIRICO de programacion excel es tan hermoso y mas con personas como tu que hacen un gran aporte de antemano mil gracias

    • sergioacamposh
      April 11, 2012 at 21:26

      Palabras inesperadas, pero bien recibidas.

  2. Luis Hernandez
    April 12, 2012 at 11:23

    Tu blog es excelente, muchas gracias por compartir

    Saludos

    Luis (Chile)

    • sergioacamposh
      April 12, 2012 at 12:47

      Saludos (México) 😉

  3. Juan Carlos
    April 22, 2012 at 18:58

    excelente, me ha servido de mucha ayuda tus codigos, saludos

    • sergioacamposh
      April 22, 2012 at 19:27

      Qué bueno.

      Saludos !!

  4. hadadeamor
    June 8, 2012 at 00:39

    hola Sergio ; una pregunta.. en donde dice que ‘ahi va el codigo que el usuario decida dar acceso.. como que hiria.. ; ya que te comento tengo un libro que kiero implementarle este valioso aporte tuyo, pero las otras macros pequeñas que tengo estan en cada hoja que tengo… mi libro esta conformado por cinco hojas que contienen macros , como puedo hacer..
    saludos..

    • June 8, 2012 at 07:11

      El código que podrías implementar es alguno que te oculte las demás hojas si es que decides que no las vean si no ingresan un password correcto.

      Conforme al código de cada hoja te recomiendo que todas tus macros las pongas en un módulo independiente y las mandas llamar desde cada hoja.

  5. Alejandro Nahuelhual
    July 6, 2012 at 12:53

    Hola Sergio, junto con saludarte y agradecerte por el tiempo que dedicas al foro haciendo las cosas complicadas más simple para nosotros, los novatos, bien, mi pregunta es la sgte. Tu VBA esta excelente, sólo necesito que el usuario y clave lo muestre al momento de abrir el archivo, si no encuentra coincidencias, simplemente que no abra nada, a diferencia de ahora, aunque le des cerrar igualmente te deja ver las demas hojas.

    Alejandro Nahuelhual
    Chile

    • July 7, 2012 at 22:00

      Para que se muestre al momento de abrir el archivo, debes especificarlo en el objeto ThisWorkbook con la instrucción:

      Private Sub Workbook_Open()
      UserForm1.Show
      End Sub

      Para que si la contraseña está incorrecta o no, utiliza la siguiente línea como se te acomode mejor:

      Sheets(“Hoja2”).Visible = False

  6. Alejandro Nahuelhual
    July 6, 2012 at 15:19

    Sergio, nuevamente yo, jejejeje, pasa que pude hacer lo que te pedi anteriormente, pero ahora me toco ver que si coloco el usuario por error con mayuscula, me da un error 91, el cual me lleva directamente a VBA, la idea es que tampoco lo deje pasar ó que le diga que el usuario es incorrecto, se entiende????, me podrias ayudar con eso?

    Alejandro Nahuelhual

    • July 7, 2012 at 22:15

      Para esto sólo cambia la línea siguiente:

      DatoEncontrado = Rango.Find(What:=Me.txtUsuario.Value, LookAt:=xlWhole, MatchCase:=False).Address

      A la línea anterior solo le agregué LookAt:=xlWhole

      Y mi recomendación es que tanto el texto que tengas en tu tabla como el introducido en el TextBox sea mayúscula o minúscula.

  7. JORGE PALACIOS
    July 31, 2012 at 15:25

    Saludos Sergio, soy algo obstinado y trato de pedir ayuda. siento mucho si te inoportuno
    me podrias dar tu opinion sobre mi codigo por favor

    SE ME OCURRIO HACER OTRO FORMULARIO PARA OTRO USUARIO QUE REQUIERE ACCESO PERO CON OTRAS FUNCIONES POR ASI DECIRLO. LO QUE PASA ES QUE ME TOMA COMO SI FUESE EL MISMO QUE EL CODIGO ANTERIORO ME DA ACCESO PERO PASA DERECHO AL MsgBox Y LUEGO ME SACA

    ESTE ES EL CODIGO DEL FORMULARIO EN EL CUAL TENGO LOS BOTONES PARA ABRIR LOS FORMULARIOS DE ACCESO

    Private Sub UserForm_Activate()

    Application.Visible = True

    End Sub

    ESTE ES EL CODIGO DE MI FORMULARIO DE ACCESO

    Private Sub CMBCU1_Click()

    If TXT1.Text = “ADMIN” And TXT2.Text = “ADMIN” Then
    Ingreso = True
    Sheets(“INICIO”).Visible = True
    Sheets(“CLIENTES”).Visible = True
    Sheets(“INVENTARIO”).Visible = True
    Sheets(“PRODUCTOS”).Visible = True
    FRMMENU.Show

    Else
    Ingreso = False
    Sheets(“CLIENTES”).Visible = False
    Sheets(“INVENTARIO”).Visible = False
    Sheets(“PRODUCTOS”).Visible = False

    End If

    Sheets(“INICIO”).Select
    MsgBox (” Ingrese Usuario y Contraseña?”)
    Unload Me

    End Sub

    HASTA AHI REBIEN.

    SE ME OCURRIO HACER OTRO FORMULARIO PARA OTRO USUARIO QUE REQUIERE ACCESO PERO CON OTRAS FUNCIONES POR ASI DECIRLO. LO QUE PASA ES QUE ME TOMA COMO SI FUESE EL MISMO QUE EL CODIGO ANTERIORO ME DA ACCESO PERO PASA DERECHO AL MsgBox Y LUEGO ME SACA

    Private Sub CMBCU3_Click()

    If TXT3.Text = “USER” And TXT4.Text = “USER” Then
    Ingreso = True
    Sheets(“ACCESO ADMINISTRADOR”).Visible = True
    Sheets(“CLIENTES”).Visible = True
    Sheets(“INVENTARIO”).Visible = True
    Sheets(“PRODUCTOS”).Visible = True
    FRMBIENVENIDOADMIN.Show

    Else
    Ingreso = False
    Sheets(“CLIENTES”).Visible = False
    Sheets(“INVENTARIO”).Visible = False
    Sheets(“PRODUCTOS”).Visible = False

    End If

    Sheets(“INICIO”).Select
    MsgBox (” Ingrese Usuario y Contraseña?”)
    Unload Me

    End Sub

    • August 2, 2012 at 18:25

      Según tu código:

      Sheets(“INICIO”).Select
      MsgBox (” Ingrese Usuario y Contraseña?”)
      Unload Me

      Te selecciona la hoja INICIO, te muestra el formulario y después lo cierra. Es correcto el funcionamiento ?

  8. emmxnuel
    September 14, 2012 at 14:13

    Gracias! 😉 esto me fue de mucha ayuda y no cabe duda q excel no tiene limtes 😀

  9. luis ortiz
    September 17, 2012 at 14:46

    saludos sergio, sabes me base en tu codigo para poder hacer mi pantalla de acceso, pero por alguna razon no me toma datos en DatoEncontrado no toma el valor de la caja de texto

    ElseIf UsuarioExistente = 1 Then

    DatoEncontrado = Rango.Find(What:=Me.TextBox1.Value, LookAt:=xlWhole, MatchCase:=False).Address

    Contrasenia = Range(DatoEncontrado).Offset(0, 1).Value

    If Range(DatoEncontrado).Value = TextBox1.Value And Contrasenia = TextBox2.Value Then
    Range(“G2”).Value = “Usuario: ” & Range(DatoEncontrado).Offset(0, -1).Value

    • September 17, 2012 at 17:28

      Que tal Luis:

      Puedes dar detalles del error que te marca y la línea de código que arroja el error.

  10. Manuel Ramirez
    September 20, 2012 at 16:57

    Buenas tardes sergio realice una entreda de usuario y contraseña me sucede lo mismo que luis los datos a encontrar son numericos pero me arroja error en esta linea “DatoEncontrado = Rango.Find(What:=Me.TextBox1.Value, LookAt:=xlWhole, MatchCase:=False).Address”.
    que puedo hacer en este caso.

    • September 22, 2012 at 14:56

      Ubica éstas líneas:

      Contrasenia = Range(DatoEncontrado).Offset(0, 1).Value
      If Range(DatoEncontrado).Value = Me.txtUsuario.Value And Contrasenia = _

      Y reemplázalas con éstas:

      Contrasenia = CStr(Range(DatoEncontrado).Offset(0, 1).Value)
      If CStr(Range(DatoEncontrado).Value) = Me.txtUsuario.Value And Contrasenia = _

      Se hace la conversión de número a texto para que funcione con passwords numéricos.

  11. David Franco
    November 2, 2012 at 08:25

    Buenos dias Sergio, dos cositas, la priemra es que el link de descarga ya no esta activo, haber si porfavor podrias enviarmelo a este correo: qffranco@gmail.com. Lo segundo es que copie tu codigo pero al ir ejecutandolo por pasos me sale el siguiente error: “erro de compilacion el uso de la palabra me no es valido. Uso excel 2007. Ya he copiados otras macrso con este me y me sale el mismo error, por que otroa propiedad podria reemplazarlo o que puedo hacer?. Por ultimo felicitaciones por compartir sus conocimientos. Muchas gracias.

  12. Antonio
    December 8, 2012 at 19:03

    Muchísimas gracias por tus estupendos aportes. El formulario tiene un problema, si le das a “cerrar”, accedes al libro sin necesidad de usuario y contraseña. ¿Cómo se soluciona esto?

    • December 9, 2012 at 08:33

      Hola Antonio:

      Te comento que no un problema, sino que no le programé esa función para permitir que se adecúe a las necesidades de quien desee usarlo.

      Si lo que esperas es que al darle Cerrar, se cierre el libro, añade este código en el botón:

      ThisWorkbook.Close SaveChanges:=False

      Si deseas consultar nuevas actualizaciones visita nuestro nuevo Blog:

  13. Eduardo
    December 22, 2012 at 17:01

    Maestro, agradeciendo su tremendo aporte, le quisiera hacer una pregunta que, quizás, viene de mi ignorancia.
    ¿Por qué cuando replico su código, la variable “blog” me arroja “Error de compilación: No se ha definido la variable”?

    Le agradezco de antemano su ayuda.

    • December 23, 2012 at 15:06

      Que tal Eduardo:

      Yo uso la variable Blog, para poner el mismo título a las ventanas que desarrollo en Excel. Pero en lugar de Blog, puede introducir un texto tipo “Título de la ventana”, para que te muestre ese dato.

      Si deseas tener una variable, solo será cuestión de declararla y darle un valor:

      Dim Var As String
      Var = "Texto de mi variable"

      • Eduardo
        December 23, 2012 at 15:13

        Muchas gracias por la pronta respuesta.

        Entiendo el por qué y el uso de “Blog”, lo que no entendía era que por qué me pedía definir Blog como una variable (y luego todas las demás que no han sido definidas).
        No sé si me explico =P

      • December 23, 2012 at 20:11

        Saludos Eduardo.

        Y recuerda que nuestro nuevo Blog, donde puedes encontrar esta información y las más reciente es http://blogs.itpro.es/exceleinfo/

    • December 23, 2012 at 15:23

      Ese mensaje sale cuando en tu módulo tiene el texto Option Explicit que obliga a definir todas las variables que uses en tus macros.

      • Eduardo
        December 23, 2012 at 19:57

        Ahora nos entendemos perfectamente. Y yo que creía que era para otra cosa hahahaha

        ¡Muchas gracias, maestro!

  14. Loreley
    October 3, 2013 at 13:45

    SErgio
    Excelente este aporte! me resultó super útil
    El único problemita que tengo es que necesito que las contraseñas sean alfanuméricas y probando con tu código si cambio en la tabla las contraseñas en texto por alfanuméricas me da error.
    Podrías ayudarme? Cómo tendría que modificar el código?
    Desde ya muchas gracias!!!

    • October 3, 2013 at 14:41

      Te invito a visitar la nueva dirección de este Blog. http://blogs.itpro.es/exceleinfo

      Hay formatear a Cadena de texto la variable Contrasenia.

      La línea

      Contrasenia = Range(DatoEncontrado).Offset(0, 1).Value

      Se cambia por esta

      Contrasenia = CStr(Range(DatoEncontrado).Offset(0, 1).Value)

      • Loreley
        October 4, 2013 at 08:36

        Muchas gracias Sergio! Funcionó perfecto.
        Pero ahora tengo otro problema.
        Si me posiciono en la hoja 1, para que no se vea la tabla de la hoja 2 me da error. Intenté poner en el código la siguiente línea:
        UsuarioExistente = Application.WorksheetFunction.CountIf(Hoja2.Range(“D3:D12”), _
        Me.txtUsuario.Value)
        Msgbox UsuarioExistente

        y me muestra que UsuarioExistente=0 y entonces me dice que el usuario no existe.
        Podrías indicarme qué estoy haciendo mal?
        Desde ya muchísimas gracias por tu ayuda!!!!!

  15. Loreley
    October 8, 2013 at 08:50

    SERGIO:
    Podrás asesorarme acerca de este problema?
    Si me posiciono en la hoja 1, para que no se vea la tabla de la hoja 2 me da error. Intenté poner en el código la siguiente línea:
    UsuarioExistente = Application.WorksheetFunction.CountIf(Hoja2.Range(“D3:D12″), _
    Me.txtUsuario.Value)
    Msgbox UsuarioExistente

    y me muestra que UsuarioExistente=0 y entonces me dice que el usuario no existe.
    Podrías indicarme qué estoy haciendo mal?
    Desde ya muchísimas gracias por tu ayuda!!!!!

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s