Cómo crear una forma de inicio de sesión en VBA Excel

Ya que hemos estado hablando de seguridad y VBA, estaría bien hablar de formas de inicio de sesión para Excel VBA y cómo crear uno para propósitos generales, como lo puede ser su uso para mostrar hojas de cálculo ocultas para los usuarios que utilicen nuestras aplicaciones.

El principio que aplicaremos aquí también podrá ser usado para poder iniciar sesión o para poder verificar identidad de usuario contra bases de datos como Access o Sql Server.

Primeros pasos

Lo primero será crear el formulario en el editor de VBA, para lo cual también podemos usar el acceso rápido ALT+F11, lo cual nos llevará directo al editor de VBA; entonces iremos a la pestaña «Insertar» y seleccionaremos «UserForm».

VBA crear userform

Lo siguiente será darle un nombre a nuestra forma y ajustar el tamaño, para lo cual podremos utilizar nuestro mouse y arrastrar nuestra ventana al tamaño deseado.

VBA crear userform ajustar tamaño

Si hace falta, podremos también ajustar el tamaño de forma exacta yendo a las propiedades de la forma, el cual (de no estar ya visible) podremos encontrar yendo a la pestaña «Vista» y en la opción «Propiedades de ventana».

VBA crear userform ventana de propiedades

Vamos a entrar a las propiedades para nuestra forma, donde veremos que hay muchas opciones para editar, pero no hará falta editarlas todas, pues solo buscamos cambiar un puñado de opciones. En concreto serán estas:

VBA crear userform ventana de propiedades 2

Con estos cambios realizados, veremos que tenemos una ventana vacía, por lo que hará falta añadir algunos controles a esta forma, que en este caso serán dos ya que buscamos hacer un formulario de inicio de sesión con dos botones para confirmar datos y cerrar la ventana.

Creando la forma

forma inicio de sesion Excel 1

Primero deberemos asegurarnos de que el cuadro de herramientas de VBA esté visible, sea sensible al contexto y sea solo visible cuando una forma en el modo diseño esté enfocada. Para esto, vamos a dar click en nuestra forma e iremos a la pestaña «Vista», luego a la opción «Caja de herramientas».

Con esto hecho, vamos a buscar la ventana que apareció y arrastraremos el botón de comando y la caja de herramientas dos veces a nuestra forma.

Aquí tendremos la opción de ajustar manualmente el tamaño y posición de los botones usando el mouse o para ajustes más precisos usar el panel de propiedades para ajustar el largo, ancho y las posiciones (recuerda dar primero click al control y luego editar sus propiedades).

forma inicio de sesion Excel 2

Esta forma será la más adecuada para crear formas precisas y alineadas. Si todo ha salido bien, tendremos algo que se verá así:

forma inicio de sesion Excel 3

Cuando hayamos creado la forma necesitaremos tener el modo de diseño y el modo run al mismo tiempo, tal y como muestra la imagen. Si queremos que nuestra forma se vea tal y como aparece aquí, habrá que introducir los siguientes valores en cada uno de los campos y botones que hemos añadido:

Una última cosa por configurar es el control «TabIndex» para que cuando nos encontremos enforcados en el campo de nombre de usuario podamos presionar Tab para pasar al siguiente campo, el cual sería el de contraseña y al hacerlo de nuevo, resaltar el botón de cancelar y finalmente el botón para iniciar sesión.

Haciendo el código que controlará la forma

Iremos al módulo de código y con la forma seleccionada daremos click al botón de «ver código», esto abrirá el módulo de código que estará manejando nuestra forma de inicio de sesión.

forma inicio de sesion Excel 4

Para hacer esta forma vamos a usar una metodología orientada a objetos, lo que significa que se va a comunicar a una rutina de llamados, el usuario introducido, la contraseña introducida y si el usuario decidió cancelar la acción por medio del botón «cancelar.

Por lo tanto, esto significa que tendrá tres propiedades «públicas», las cuales serán:

  • aaaUsername,
  • aaaPassword y
  • aaaCancelClicked

(el «aaa» siendo necesario porque así se acomodará en la punta del Intellisense.)

Option Explicit
 
Public aaaUserName As String
Public aaaPassword As String
Public aaaCancelClicked As Boolean
 
Private Sub cmdCancel_Click()
    aaaCancelClicked = True
    Me.Hide
End Sub   
 
Private Sub cmdLogin_Click()
 ' Assign textbox values to properties above.
    Me.aaaUserName = Me.txtUserName
    Me.aaaPassword = Me.txtPassword
    Me.Hide
End Sub 

Y esta será la forma ya hecha. Si el usuario añade su nombre de usuario y contraseña, las propiedades adecuadas serán puestas. Al dar click en iniciar sesión, la forma será ocultada y las propiedades estarán disponibles al llamar una subrutina para examinarse.

Código que usa la forma de inicio de sesión

Para mostrar un ejemplo simple de cómo se ejecutaría y probaría la forma de inicio de sesión, vamos a insertar un módulo ordinario a nuestro proyecto.

Y añadiremos el siguiente código.

' Default retun value of function is False
Private Function LoginUser() As Boolean
Dim ofLogin As frmLogin
Dim szPassword As String, szUserName As String
Set ofLogin = New frmLogin 
ofLogin.Show vbModal 
' Code stops here until user types login 
szUserName = ofLogin.aaaUserName 
szPassword = ofLogin.aaaPassword 
' Destroy login form to tidy up 
Set ofLogin = Nothing 
If Validation(szUserName, szPassword) Then 
LoginUser = True 
End If
End Function

Esta función que se muestra a continuación es llamada de otra rutina y arrojará un valor False si el usuario falla la prueba de inicio de sesión, así como arrojará un valor True si el usuario acierta.

Tal y como se mencionó antes, estaremos usando la forma como un objeto, por lo que:

  • Las líneas 22 a la 25 crearán la forma en la memoria.
Set ofLogin = New frmLogin
  • La línea 26 mostrará la forma, pero dado que usamos vbModal como el argumento, el código se detiene ahí hasta que el usuario elija «Iniciar sesión» o «Cancelar»
ofLogin.Show vbModal
  • Las líneas 27 y 28 consiguen el nombre de usuario y la contraseña desde la forma, y para este punto ya no necesitamos la forma, puesto que ya tenemos nuestra información de esta, así que damos en OK para «cerrarla».
szUserName = ofLogin.aaaUserName
szPassword = ofLogin.aaaPassword
  • Esto lo hacemos vaciando la variable de memoria en la línea 30.
Set ofLogin = Nothing
  • La línea 31 es una función personalizada que valida el nombre de usuario y la contraseña.
If Validation(szUserName, szPassword) Then

Y la función Validation es la siguiente:

Function Validation(ByRef szUserName As String, szPassword As String) As Boolean
Select Case szUserName
Case "Pedro"
If szPassword = "1" Then Validation = True
Case "Mario"
If szPassword = "2" Then Validation = True
Case "Juan"
If szPassword = "3" Then Validation = True
Case "Claudia"
If szPassword = "0" Then Validation = True
Case "Sebastian"
If szPassword = "-1" Then Validation = True
Case Else
Validation = False
End Select
End Function

Esta función Validation podria ser reemplazada por un For-Loop en alguna hoja de calculo, en este caso la dejamos así para efectos practicos.

  • Si la contraseña es correcta, el código irá hasta la línea 32, donde el valor de retorno de la función está establecido como True.
LoginUser = True

Función controladora Principal

Por tanto, demos un vistazo rápido al código que llama a la función LoginUser de arriba

Option Explicit
Sub SystemLogon()
Dim bResult As Boolean
Dim szUserName As String
bResult = LoginUser()
If bResult Then
' Great we're good to go, code to allow access to system below
MsgBox "Access Granted!", vbExclamation
Else
' Failed login, locked out of system
MsgBox "Access Denied!", vbExclamation
End If
End Sub

La línea 7 llama a la función de inicio de sesión y obtiene un boolean True/False de regreso

bResult = LoginUser(szUserName)

De ser True, el usuario pasó la validación y el código entra a la cláusula If en la línea 9 y obtiene acceso al código en las líneas 10 a la 12.

If bResult Then
' Great we're good to go, code to allow access to system below
MsgBox "Access Granted!", vbExclamation

Si el inicio de sesión falla o el usuario elige cancelar, entonces vamos a la parte else del statement, en las líneas 14 a la 16.

' Failed login, locked out of system
MsgBox "Access Denied!", vbExclamation

El código completo.

Para resumir, así se verán los dos códigos, tanto de la UserForm y del Modulo normal.

USERFORM

Option Explicit
Public aaaUserName As String
Public aaaPassword As String
Public aaaCancelClicked As Boolean
Private Sub cmdCancel_Click()
aaaCancelClicked = True
Me.Hide
End Sub
Private Sub cmdLogin_Click()
' Assign textbox values to properties above.
Me.aaaUserName = Me.txtUserName
Me.aaaPassword = Me.txtPassword
Me.Hide
End Sub

MODULO

Option Explicit
Sub SystemLogon()
Dim bResult As Boolean
Dim szUserName As String
bResult = LoginUser()
If bResult Then
' Great we're good to go, code to allow access to system below
MsgBox "Access Granted!", vbExclamation
Else
' Failed login, locked out of system
MsgBox "Access Denied!", vbExclamation
End If
End Sub


' Default retun value of function is False
Private Function LoginUser() As Boolean
Dim ofLogin As frmLogin
Dim szPassword As String, szUserName As String
Set ofLogin = New frmLogin ofLogin.Show vbModal ' Code stops here until user types login szUserName = ofLogin.aaaUserName szPassword = ofLogin.aaaPassword ' Destroy login form to tidy up Set ofLogin = Nothing If Validation(szUserName, szPassword) Then LoginUser = True End If
End Function


Function Validation(ByRef szUserName As String, szPassword As String) As Boolean
Select Case szUserName
Case "Pedro"
If szPassword = "1" Then Validation = True
Case "Mario"
If szPassword = "2" Then Validation = True
Case "Juan"
If szPassword = "3" Then Validation = True
Case "Claudia"
If szPassword = "0" Then Validation = True
Case "Sebastian"
If szPassword = "-1" Then Validation = True
Case Else
Validation = False
End Select
End Function

Un toque jocoso seria añadir este método al evento Open del libro para impedir el acceso a un libro o solo dar permiso de ver ciertas hojas en Excel. O mejor aún, solo un mensaje para molestar pero que no impida nada.

forma inicio de sesion Excel 5

Cualquier duda nos leemos abajo.

Cómo crear una forma de inicio de sesión en VBA Excel
Scroll hacia arriba