2017-06-03 129 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