2017-06-03 2 views
1

J'ai essayé d'obtenir mon login userform pour se connecter lorsque je clique sur la base de données dans un tableau dans le classeur, mais je n'arrive pas à obtenir le code correct .Excel VBA & UserForm Connexion et mot de passe Table VLOOKUP dans feuille

Détails sont:

Userform nom d'utilisateur = zone de texte UsernameTextbox;

Userform mot de passe textbox = PasswordTextbox;

Userform bouton submit = LoginButton

Mon classeur a un certain nombre de feuilles, dont l'un "Users". Dans cette feuille, il y a une table appelée "Users_Table". Cette table a 4 colonnes:

ID (ID individuels pour les utilisateurs) [colonne A],

Nom d'utilisateur [colonne B],

Mot de passe [colonne C],

(Admin la réponse est "Vrai" ou "Faux" selon qu'ils ont des droits d'administrateur) [Colonne D].

Je suis en train de le faire: Si le nom d'utilisateur et mot de passe est correct pour un utilisateur et si l'entrée de la colonne d'administration est faux, alors je veux montrer des feuilles "Quick Add" et "Overview", je veux faire la feuille "Admin" caché (pas très caché depuis que j'ai besoin d'utiliser des données sur cette feuille pour d'autres macros), et faire feuilles VeryHidden afin que ceux qui sont connectés ne peuvent pas voir les détails des autres utilisateurs. Mais pour les utilisateurs qui saisissent correctement leur nom d'utilisateur et mot de passe ET pour qui l'entrée de la colonne d'administration est True, je veux afficher toutes les feuilles.

C'est ce que j'ai jusqu'à présent:

Private Sub LoginButton_Click() 
    Dim Username As String 
    Username = UsernameTextbox.Text 
    Dim password As String 
    Password = PasswordTextbox.Text 
    If IsNull(Me.UsernameTextbox) Or Me.UsernameTextbox = "" Then 
    MsgBox "You must enter your username.", vbOKOnly, "Required Data" 
    Me.UsernameTextbox.SetFocus 
    Exit Sub 
    End If 
    If IsNull(Me.PasswordTextbox) Or Me.PasswordTextbox = "" Then 
    MsgBox "You must enter your Password (case sensitive).", vbOKOnly, "Incomplete Entry" 
    Me.PasswordTextbox.SetFocus 
    Exit Sub 
    End If 
    Dim temp As String 
    On Error Resume Next 
    temp = WorksheetFunction.VLookup(Me.UsernameTextbox.Value, Worksheets("Users").Range("Users_Table"), 2, 0) 
    If Username = temp Then 
    Err.Clear 
    temp = "" 
    temp = WorksheetFunction.VLookup(Me.UsernameTextbox.Value, Worksheets("Users").Range("Users_Table"), 3, 0) 
    On Error Goto 0 
    If Password = temp Then 
     Sheets("Quick Add").Visible = xlSheetVisible 
     Sheets("Overview").Visible = xlSheetVisible 
     Sheets("Admin").Visible = xlSheetHidden 'This is now just Hidden and not VeryHidden since other macros need to use data on this sheet 
     Sheets("Users").Visible = xlVeryHidden 
     MsgBox "Password and Username Accepted. You are now Logged In." 
     'Unload Me 
     'Sheets("Quick Add").Select 
     'Range("A1").Select 
    Else 
     Sheets("Quick Add").Visible = xlVeryHidden 
     Sheets("Overview").Visible = xlVeryHidden 
     Sheets("Admin").Visible = xlVeryHidden 
     Sheets("Users").Visible = xlVeryHidden 
     MsgBox "Username and Password Combination Not Accepted" 
    End If 
    Else 
    Sheets("Quick Add").Visible = xlVeryHidden 
    Sheets("Overview").Visible = xlVeryHidden 
    Sheets("Admin").Visible = xlVeryHidden 
    Sheets("Users").Visible = xlVeryHidden 
    MsgBox "Invalid Username" 
    End If 
End Sub 

Cela fonctionne pour la première entrée dans le "Users_Table", mais il ne reconnaît pas le nom d'utilisateur pour les autres (et donc je ne sais pas si elle est reconnaître les mots de passe pour les utilisateurs car cela échoue lors de la vérification initiale du nom d'utilisateur). Des idées sur ce qui pourrait mal tourner? Je ne sais pas non plus comment je pourrais ajouter l'exigence d'administration mentionnée ci-dessus. J'ai besoin d'administrateurs ("True" dans la colonne "Admin", c'est-à-dire la colonne D, dans le "Users_Table") pour pouvoir voir toutes les feuilles; le code ci-dessus est juste pour les utilisateurs et montre "Quick Add" et "Overview" et cache "Admin" et "Users" feuilles.

Toute aide serait grandement appréciée. Je vous remercie!

Répondre

0

Vous l'avez rendu très compliqué. Rester simple. Essayez ceci (non testé)

Private Sub LoginButton_Click() 
    Dim Username As String 
    Dim password As String 
    Dim passWs As Worksheet 
    Dim rng As Range 
    Dim CorrectDetails As Boolean 

    Username = UsernameTextbox.Text 
    password = PasswordTextbox.Text 

    If Len(Trim(Username)) = 0 Then 
     UsernameTextbox.SetFocus 
     MsgBox "Please enter the username", vbOKOnly, "Required Data" 
     Exit Sub 
    End If 

    If Len(Trim(password)) = 0 Then 
     PasswordTextbox.SetFocus 
     MsgBox "Please enter the password", vbOKOnly, "Incomplete Entry" 
     Exit Sub 
    End If 

    Set passWs = ThisWorkbook.Worksheets("Users") 

    With passWs 
     lrow = .Range("A" & .Rows.Count).End(xlUp).Row 

     For i = 1 To lrow 
      If UCase(Trim(.Range("B" & i).Value)) = UCase(Trim(Username)) Then '<~~ Username Check 
       If .Range("C" & i).Value = password Then '<~~ Password Check 
        CorrectDetails = True 

        '~~> Admin is True 
        If .Range("D" & i).Value = "True" Then 
         ' 
         '~~> Do what you want 
         ' 
        Else 
         ' 
         '~~> Do what you want 
         ' 
        End If 

        Exit For 
       End If 
      End If 
     Next i 

     '~~> Incorrect Username/Password 
     If CorrectDetails = False Then 
      MsgBox "Invalid Username/Password" 
     End If 
    End With 
End Sub 

Mes hypothèses

Dans la feuille "Utilisateurs", Col B a le nom d'utilisateur, mot de passe Col C a et Col D a des valeurs administrateur .. Si non, s'il vous plaît modifier ci-dessus code au besoin.

+0

Brillant! Juste ce dont j'avais besoin. Je vous remercie! – akrasia

0

Des idées sur ce qui pourrait ne pas fonctionner?

Il y a quelques erreurs dans le code qui ne correspondent pas à votre description.

temp = WorksheetFunction.VLookup(Me.UsernameTextbox.Value, _ 
    Worksheets("Users").Range("Users_Table"), 2, 0) 
If Username = temp Then 

Vous assortissent la UsernameTextbox à la colonne A (ID).Le test pour l'existence du nom d'utilisateur doit être dans la colonne B ne A. La même erreur est faite que si vous correspondant le nom d'utilisateur sur la colonne ID A insread de la colonne B des noms d'utilisateur:

temp = WorksheetFunction.VLookup(Me.UsernameTextbox.Value, _ 
    Worksheets("Users").Range("Users_Table"), 3, 0) 

La meilleure approche serait de ramener à la ligne de l'utilisateur à la fois (si elle existe) et à partir de là obtenir tous les attributs.

Private Sub LoginButton_Click() 
    ' Get the user row or exit if not found 
    Dim r As Range 
    Set r = Worksheets("Users").Range("Users_Table").Columns(2) _ 
    .Find(UsernameTextbox.text, , xlValues, xlWhole) 
    If r Is Nothing Then 
    MsgBox "username not found." 
    Me.UsernameTextbox.SetFocus 
    Exit Sub 
    End If 
    If Me.PasswordTextbox.Value <> r.Offset(, 1).Value2 Then 
    MsgBox "Wrong Password." 
    Me.PasswordTextbox.SetFocus 
    Exit Sub 
    End If 

    ' So far user and password are ok 
    Dim isAdmin As Boolean: isAdmin = r.Offset(, 2).Value2 
    Sheets("Quick Add").Visible = xlSheetVisible 
    Sheets("Overview").Visible = xlSheetVisible 
    Sheets("Admin").Visible = IIf(isAdmin, xlSheetVisible, xlSheetHidden) 
    Sheets("Users").Visible = IIf(isAdmin, xlSheetVisible, xlSheetVeryHidden) 
End Sub 
+0

Merci beaucoup d'avoir pris le temps de répondre. Votre réponse a bien fonctionné, mais je suis allé avec la réponse de Siddharth Rout car leur code était un peu plus simple. Je vais continuer à jouer avec les deux pour voir ce qui fonctionne le mieux. Merci beaucoup encore. – akrasia