Excel VBA и UserForm Логин и пароль VLOOKUP Таблица в листе

Я пытался заставить мою форму входа в систему войти в систему при нажатии на основе данных в таблице в рабочей книге, но я просто не могу понять, что код правильный.

Подробности:

Userform username textbox = UsernameTextbox;

Userform пароль textbox = PasswordTextbox;

Кнопка подтверждения формы пользователя = LoginButton

В моей книге есть несколько листов, один из которых "Users", На этом листе есть таблица "Users_Table", Эта таблица имеет 4 столбца:

ID (индивидуальные идентификаторы для пользователей) [столбец A],

Имя пользователя [столбец B],

Пароль [Колонка C],

Admin (ответ "True" или "False" в зависимости от того, имеют ли они права администратора) [Столбец D].

Я пытаюсь сделать это: если имя пользователя и пароль верны для пользователя И если запись в столбце администратора имеет значение False, то я хочу показать листы "Quick Add" а также "Overview"Хочу сделать лист "Admin" скрытый (не VeryHidden, так как мне нужно использовать данные на этом листе для других макросов), и сделать "User" листы VeryHidden, поэтому вошедшие в систему не могут видеть детали других пользователей. Но для пользователей, которые правильно вводят свои имя пользователя и пароль И для которых в столбце администратора указано значение 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" столбец, то есть столбец D, в "Users_Table") иметь возможность видеть все листы; код выше только для пользователей и показывает "Quick Add" а также "Overview" и прячет "Admin" а также "Users" листы.

Любая помощь приветствуется. Спасибо!

3 ответа

Решение

Вы сделали это очень сложно. Будь проще. Попробуйте это (не проверено)

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

Мои предположения

На листе "Пользователи" Col B имеет имя пользователя, Col C имеет пароль, а Col D имеет значения Admin. Если нет, пожалуйста, измените вышеуказанный код, как требуется.

Есть идеи, что может пойти не так?

В коде есть несколько ошибок, которые не соответствуют вашему описанию.

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

Здесь вы подходите UsernameTextbox в колонку А (ID). Проверка на наличие имени пользователя должна быть в столбце 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

Всем привет,
я знаю, что это было давным-давно, но, возможно, это было бы полезно для sm1, приведенный выше код не работал у меня, поэтому я модифицирую его для своих требований.

Некоторые детали моего кода:CommandButton2 это моя «кнопка входа в систему»;
TextBox5 это мое "имя пользователя / администратора";
TextBox7 это мой «пароль пользователя / администратора»;
Рабочие листы («ЖУРНАЛ») - это имя и расположение таблицы с данными «Имена пользователей / администраторов и пароли», где столбец B - имена пользователей, столбец C - пароли пользователей, столбец d - имена администраторов, столбец - пароли администраторов. Разница между правами администратора и пользователя в моем случае только в видимости приложения (Excel).

      Private Sub CommandButton2_Click()

Dim passWs As Worksheet
Dim CorrectDetails As Boolean

Username = TextBox5.Text
password = TextBox7.Text

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

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

Set passWs = ThisWorkbook.Worksheets("LOG")

With passWs
    lRow = .Range("B" & .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
                
                If CorrectDetails = True Then
                    Application.Visible = False
                    Me.TextBox5.Text = ""
                    Me.TextBox7.Text = ""
                    LogIn.Hide
                    UserForm1.Show
                End If
                
                Exit For
            End If
        End If
        
        If UCase(Trim(.Range("D" & i).value)) = UCase(Trim(Username)) Then '<~~ Adminname Check
            If .Range("E" & i).value = password Then '<~~ Admin Password Check
                CorrectDetails = True
                
                If CorrectDetails = True Then
                    Application.Visible = True
                    Me.TextBox5.Text = ""
                    Me.TextBox7.Text = ""
                    LogIn.Hide
                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

Конец подписки

Другие вопросы по тегам