工作表中的Excel VBA和用户窗体login和密码VLOOKUP表

我一直试图让我的login用户表单login时单击基于工作簿中的表中的数据,但我似乎无法得到正确的代码。

详细信息是:

用户表单用户名文本框=用户名文本框;

用户forms的密码textbox = PasswordTextbox;

用户表单提交button= LoginButton

我的工作簿有一些表,其中之一是"Users" 。 在该表中,有一个名为"Users_Table"的表。 该表有4列:

ID(用户的个人ID)[列A],

用户名[列B],

密码[C栏],

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

我试图做到这一点:如果用户名和密码是正确的用户,如果pipe理栏条目是假的,那么我想显示工作表"Quick Add""Overview" ,我想使工作表"Admin"隐藏(不是非常隐藏,因为我需要使用这张表上的数据为其他macros),并使"User"表非常隐藏,所以这些login无法看到其他用户的详细信息。 但是,对于正确input用户名和密码的用户以及pipe理员列条目为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"的第一个条目,但它不会识别其他用户的用户名(因此我不知道是否因为在初始用户名检查时无法识别用户的密码)。 任何想法可能会出错? 我也不知道如何去添加上面提到的pipe理要求。 我需要Admins(“ "Admin"列中的“True”,即列D中的"Users_Table" )能够查看所有表单; 上面的代码仅供用户使用,并显示"Quick Add""Overview"并隐藏"Admin""Users"表。

任何帮助将非常感激。 谢谢!

你做得很复杂 把事情简单化。 试试这个(未经testing)

 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具有密码,栏目D具有pipe理值。如果不是,则根据需要修改上述代码。

任何想法可能会出错?

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

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

这里您将UsernameTextbox与A列( ID )相匹配。 用户名存在的testing应该在B列而不是A.在用户名与ID列匹配时出现同样的错误A用户名列B的漏洞:

 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