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
Конец подписки