2017-06-03 281 views
1

我一直在尝试让我的登录用户窗体登录时单击基于表中的数据在工作簿中,但我似乎无法得到正确的代码。Excel VBA和用户窗体登录和密码VLOOKUP表

详情如下:

用户窗体的用户名的文本框= UsernameTextbox;

用户形式的密码textbox = PasswordTextbox;

用户窗体提交按钮= LoginButton

我的工作簿具有多个片材,其中之一是"Users"的。在该表中,有一张名为"Users_Table"的表格。该表有4列:

ID(个别标识为用户)[A列],

用户名[列B],

密码[柱C],

管理员(答案是“真”或“假”,具体取决于他们是否拥有管理员权限)[D栏]。

我试图做到这一点: 如果用户名和密码是用户正确的,如果管理员列条目为False,那么我想告诉张"Quick Add""Overview",我要打表"Admin"隐藏(不是非常隐藏,因为我需要使用此表上的数据来处理其他宏),并且使表非常隐藏,因此登录的用户无法看到其他用户的详细信息。但对于正确输入用户名和密码的用户以及管理员列条目为True的用户,我想显示所有表单。

这是我到目前为止有:

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 

这适用于在"Users_Table"的第一个条目,但它不会承认别人的用户名(所以我不知道这是否是识别用户的密码,因为它在初始用户名检查时失败)。任何想法可能会出错?我也不确定我如何去添加上面提到的管理员要求。我需要管理员("Admin"列中的“True”,即"Users_Table"中的列D)能够查看所有工作表;以上代码仅供用户使用,并显示"Quick Add""Overview",并隐藏"Admin""Users"表。

任何帮助将不胜感激。谢谢!

回答

0

你让它变得非常复杂。把事情简单化。尝试这种(未测试的)

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 

我的假设

在片“用户”,色柱B具有用户名,山口C具有密码和Col d具有管理员值。如果没有,那么请修改上述代码根据需要。

+0

太棒了!正是我需要的。谢谢! – akrasia

0

任何想法可能会出错?

代码中有一些错误与您的描述不符。

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

这里给您匹配UsernameTextbox列A(ID)。为用户名的存在的测试应该在B列不答犯同样的错误时,其中你的用户名匹配到ID列用户名的列B的insread:

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

最好的方法是一次获取用户的行(如果存在)并从那里获取所有属性。

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

非常感谢您花时间回复。你的回答很好,但是我已经和Siddharth Rout一起回答了,因为他们的代码更加简化了。我会继续玩,看看哪个最好。非常感谢。 – akrasia