Search code examples
ms-accessvbams-access-2003

Microsoft Access 2003 VBA - Login Form


This is my first attempt to create a login form. I've read up a few forums about it and tried them myself. However, I've encountered the error when trying out the form.

"Run time error '2001': You canceled the previous operation."

Here's my code! The error highlighted is the DLOOKUP statement. When I move my cursor to LanID, it appears to be 0. (I guess it got something to do with it?)

Option Compare Database
Option Explicit

Private intLoginAttempts As Integer

Private Sub cmdLogin_Click()
'Check mandatory fields
If IsNull(Me.txtLanID) Or Me.txtLanID = "" Then
   MsgBox "Lan ID is required.", vbOKOnly, "Required Data"
   Me.txtLanID.SetFocus
   Exit Sub
End If

If IsNull(Me.txtPassword) Or Me.txtPassword = "" Then
   MsgBox "Password is required.", vbOKOnly, "Required Data"
   Me.txtPassword.SetFocus
   Exit Sub
End If

'Compare input password and database password
If Me.txtLanID <> "" Then
   If Me.txtPassword = DLookup("Password", "tblUser", "[LanID]=" & Me.txtLanID) Then
      LanID = Me.txtLanID

      'Close Login Page
      DoCmd.Close acForm, "frmUserLogin", acSaveNo

      'Check whether user is an admin
      If Me.txtAdmin = DLookup("Administrator", "tblUser", "[LanID]=" & Me.txtLanID) Then
         If Me.txtAdmin = -1 Then
            DoCmd.OpenForm "frmMenu"
            Else
               DoCmd.OpenForm "frmBack"
         End If
      End If

   Else
      MsgBox "Invalid Password. Try again.", vbOKOnly, "Invalid Entry!"
      Me.txtPassword.SetFocus
   End If
End If

'If user enters incorrect password 3 times
intLoginAttempts = intLoginAttempts + 1
If intLoginAttempts = 3 Then
   MsgBox "You do not have access to the database. Please contact system administrator.", vbCritical, "Restricted Access!"
   Application.Quit
End If
End Sub

Solution

  • If tblUser.LanID is text data type, enclose Me.txtLanID in quotes to avoid an error with your DLookup() expression. (You don't need .Value there because it's the default property.)

    DLookup("Password", "tblUser", "[LanID]='" & Me.txtLanID & "'")
    

    If that was not the explanation, test your DLookup() expression in the Immediate window (go there with Ctrl+g) to see whether it throws an error or what value it does return.

    Note, when you test DLookup() in the Immediate window, use the current value of Me.txtLanID. For example, if Me.txtLanID contains the text "foo", test it like this ...

    ? DLookup("Password", "tblUser", "[LanID]='foo'")