2017-06-03 25 views
1

ブックのデータに基づいてクリックするとログイン用のユーザーフォームを取得しようとしましたが、コードが正しく表示されないようです。Excel VBAとユーザーフォームのログインとパスワードVLOOKUPテーブル内のテーブル

詳細は以下のとおりです。

ユーザーフォームのユーザー名テキストボックス= UsernameTextbox。

ユーザーフォームのパスワードtextbox = PasswordTextbox;

ユーザーフォームが私のワークブックが"Users"そのうちの1つは、シートの数を、持っている= LoginButton

ボタンを提出します。そのシートには"Users_Table"という表があります。

ID(ユーザーのための個人のID)列A]、

ユーザー名[列B]、

パスワード[列C]、

管理(:この表は、4つの列を有しています彼らは管理者権限を持っているかどうかに応じて "真"または "偽"です)[列D]。私はこのやろうとしている

:ユーザー名とパスワードは、ユーザーのために正しいと管理列のエントリがfalseの場合、私はシート"Quick Add""Overview"表示したい場合は は、私はシートを作りたいです"Admin"隠されている(他のマクロにはこのシートのデータを使用する必要があるため、VeryHiddenではない)、シートをVeryHiddenにして、ログインしたユーザーは他のユーザーの詳細を見ることができない。しかし、ユーザー名とパスワードを正しく入力し、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の要件をどのように追加するかについてもわかりません。すべてのシートを表示できるようにするには、管理者が必要です("Admin"列の「True」、つまり"Users_Table"の列D)。上記のコードはUsersのみで、"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は、パスワードを持っており、コルDは、管理値を持っています必要に応じてコードを入力します。

+0

ブリリアント!ちょうど私が必要としたもの。ありがとうございました! – akrasia

0

何か問題が起こっている可能性がありますか?

あなたの説明と一致しないコードには、いくつかの誤りがあります。

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

ここでは、列A(ID)にUsernameTextboxに一致しています。

temp = WorksheetFunction.VLookup(Me.UsernameTextbox.Value, _ 
    Worksheets("Users").Range("Users_Table"), 3, 0) 
:ユーザ名の存在のためのテストは、あなたが IDカラムにユーザ名の列Bのinsreadをユーザ名に一致しているところ同じ間違いが行われ、列BないA.にする必要があります

最良の方法は、一度に(存在する場合)ユーザーの行にフェッチし、そこからすべての属性を取得することです。

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

お返事いただきましてありがとうございます。あなたの答えは素晴らしかったですが、シッダース・ルートの答えは、コードがもう少し合理化されていたので、私はそれに行きました。私はどちらが最善のものかを見るために両方とも遊んでいきます。もう一度ありがとう。 – akrasia

関連する問題