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]