Consulting

Results 1 to 12 of 12

Thread: Solved: Login / Password validation - limited attempts?

  1. #1
    VBAX Tutor
    Joined
    Mar 2005
    Posts
    221
    Location

    Solved: Login / Password validation - limited attempts?

    Hey all,
    I have some basic code, that requires users to input a login and password, to use certain parts of an application. It works just fine, but I am wondering it there is a way to only allow a limited amount of tries (maybe 3?) and if they incorrectly input info 3 times, it will kick them out, or notify some1 etc.

    Here is the vba I am using to validate the user :

    [VBA]
    Private Sub CommandButton1_Click()
    'validate username / password

    ' (user1)
    If Range("userDB!b2") = txtLogin.Value And Range("userDB!c2") = txtPassword.Value Then
    UserForm2.Show
    Else: MsgBox ("Incorrect Login and/or Password")
    End If

    (user2)
    [ code repeats its self for user 2]
    End Sub
    [/VBA]

    Also, is it possible to loop through the users rather than me tryping if/then's for each user? Thanks in advance.

  2. #2
    VBAX Mentor asingh's Avatar
    Joined
    Jul 2005
    Posts
    307
    Location
    you could try the following:

    Private Sub CommandButton1_Click()
    'validate username / password
    Dim IncorrectCounter as string
    IncorrectCounter = Range("userDB!d2").value

    If IncorrectCounter < 3 then
    ' (user1)
    If Range("userDB!b2") = txtLogin.Value And Range("userDB!c2") = txtPassword.Value Then
    UserForm2.Show
    else
    MsgBox ("Incorrect Login and/or Password")
    IncorrectCounter = IncorrectCounter + 1
    Range("userDB!d2").value = IncorrectCounter
    End If
    else
    MsgBox ("Cannot Try more than 3 logins")
    'put the rest of code..to shut down log in procedure.

    end if

    End Sub

  3. #3
    VBAX Tutor
    Joined
    Mar 2005
    Posts
    221
    Location
    Works perfect, thank-you.

    What about looping through users until it reaches the end ? This is what I have so far, but it doesnt do anything , lol ...

    [VBA]
    Dim i As Integer
    Dim intRowCount As Integer
    intRowCount = Range("b2").Count And Range("c2").Count = -1
    For i = 1 To intRowCount
    Next i
    [/VBA]

    I am not very good w/ loops, but I would want it to work sometihng similar to that. Thanks again.

  4. #4
    VBAX Master Killian's Avatar
    Joined
    Nov 2004
    Location
    London
    Posts
    1,132
    Location
    Hi there

    Here's an approach:

    Name the range of users' names, "usernames"
    Now just to test the names, you can loop through the cells of that range[VBA]Dim c As Range
    Dim ValidateUser As Boolean

    For Each c In Range("usernames").Cells
    If c.Text = txtLogin.Value Then
    ValidateUser = True
    Exit For
    End If
    Next c
    If ValidateUser = True Then
    UserForm2.Show
    End If[/VBA]Now if the user's passwords are in the next column, you can check the offset (one column over) of each range for the password on each pass.

    This is a general techique for looping through any collection. Because you're working with a worksheet range, a better technique would be using "Find" which will be much faster - useful if you have a lot of users.[VBA]Dim c As Range

    Set c = Range("usernames").Find(txtLogin.Value)
    If Not c Is Nothing Then
    If c.Offset(0, 1).Text = txtPassword.Value And _
    c.Text = txtLogin.Value Then
    Set c = Nothing
    UserForm2.Show
    End If
    End If[/VBA]
    K :-)

  5. #5
    VBAX Tutor
    Joined
    Mar 2005
    Posts
    221
    Location
    hmm...I like the second approach you listed , I will check it out. Sounds like a solved thread to me though Thanks.

  6. #6
    VBAX Tutor
    Joined
    Mar 2005
    Posts
    221
    Location
    Killian,
    what does

    [VBA]
    Set c = Nothing
    [/VBA]
    represent?

  7. #7
    VBAX Tutor
    Joined
    Mar 2005
    Posts
    221
    Location
    I got it, everything is working. Thanks for all your input guys.

  8. #8
    VBAX Master Killian's Avatar
    Joined
    Nov 2004
    Location
    London
    Posts
    1,132
    Location
    At that point, userform1 is still loaded. Setting the range variable to nothing ensures that c is tidied up (since it contains the range of a valid login) as soon as we're done with it.
    Maybe not essential as it stands, it's only a few lines of code, but when it all goes in to make up a larger program, it's good programming practice - if we come back to modify the code later, we don't get caught out by using variables that we're expaecting to be empty.

    Speaking of modifying code, I forgot to add the failure message and the login attempts:
    you could add a textbox named "lblMessage" to the form and display the user feedback that way.

    It might be better to wrap the login check in a function so here's the revisions done that way[VBA]Option Explicit

    Dim lngAttempts As Long

    Private Sub CommandButton1_Click()

    If ValidLogin(txtLogin.Value, txtPassword.Value) Then
    lngAttempts = 0
    UserForm2.Show
    lblMessage.Caption = "Username: " & txtLogin.Value
    Else
    txtLogin.Value = ""
    txtPassword.Value = ""
    lblMessage.Caption = "Login failed!"
    End If
    lngAttempts = lngAttempts + 1
    If lngAttempts = 3 Then
    lblMessage.Caption = "Locked: 3 failed login attempts"
    txtLogin.Enabled = False
    txtPassword.Enabled = False
    CommandButton1.Enabled = False
    End If

    End Sub

    Private Function ValidLogin(strName As String, strPW As String) As Boolean

    Dim c As Range

    Set c = Range("usernames").Find(strName)
    If Not c Is Nothing Then
    If c.Text = strName And c.Offset(0, 1).Text = strPW Then
    Set c = Nothing
    ValidLogin = True
    End If
    End If

    End Function[/VBA]
    K :-)

  9. #9
    VBAX Tutor
    Joined
    Mar 2005
    Posts
    221
    Location
    sweet. Thank you. This way, people cannot just sit there, and guess passwords forever.

  10. #10
    VBAX Tutor
    Joined
    Mar 2005
    Posts
    221
    Location
    hmm...something is not working. I have attached a sample file you could look at ?

  11. #11
    VBAX Master Killian's Avatar
    Joined
    Nov 2004
    Location
    London
    Posts
    1,132
    Location
    Your range includes empty cells, which we need to filter out by wrapping the Find function in an If...Then

    I also neglected to check this properly, we need to make the find lookat the whloe cell text or someone can put in part of a valid login and succeed![VBA]Private Function ValidLogin(strName As String, strPW As String) As Boolean
    Dim c As Range

    If strName <> "" And strPW <> "" Then
    Set c = Range("usernames").Find(What:=strName, LookAt:=xlWhole)
    If Not c Is Nothing Then
    If c.Text = strName And c.Offset(0, 1).Text = strPW Then
    Set c = Nothing
    ValidLogin = True
    End If
    End If
    End If
    End Function[/VBA]
    K :-)

  12. #12
    VBAX Tutor
    Joined
    Mar 2005
    Posts
    221
    Location
    Perfect.
    This works beautifully. You should have this as a KB entry. Thanks again. All aspects I tested, and everything works.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •