Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
excelvba&;表单中的UserForm登录名和密码VLOOKUP表_Vba_Excel_Userform - Fatal编程技术网

excelvba&;表单中的UserForm登录名和密码VLOOKUP表

excelvba&;表单中的UserForm登录名和密码VLOOKUP表,vba,excel,userform,Vba,Excel,Userform,我一直试图让我的登录userform在根据工作簿中的表中的数据单击时登录,但我似乎无法正确获取代码 详情如下: Userform username textbox=username textbox Userform password textbox=PasswordTextbox 用户表单提交按钮=登录按钮 我的工作簿有许多工作表,其中一个是“用户”。在该表中,有一个名为“Users\u table”的表。该表有4列: ID(用户的个人ID)[A列] 用户名[列B] 密码[C列] 管理员(答案是

我一直试图让我的登录userform在根据工作簿中的表中的数据单击时登录,但我似乎无法正确获取代码

详情如下:

Userform username textbox=username textbox

Userform password textbox=PasswordTextbox

用户表单提交按钮=登录按钮

我的工作簿有许多工作表,其中一个是
“用户”
。在该表中,有一个名为
“Users\u table”
的表。该表有4列:

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

用户名[列B]

密码[C列]

管理员(答案是“真”或“假”,取决于他们是否拥有管理员权限)[D列]

我正在尝试这样做: 如果用户的用户名和密码正确,并且“管理员”列条目为False,则我想显示工作表
“快速添加”
“概述”
,我想将工作表
“管理员”
隐藏(不是很隐蔽,因为我需要将此工作表上的数据用于其他宏),并使
成为“用户”
工作表非常隐蔽,因此登录者无法查看其他用户的详细信息。但是对于那些正确输入用户名和密码并且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\u Table”
中的第一个条目,但它不会识别其他条目的用户名(因此我不知道它是否识别用户的密码,因为它在初始用户名检查中失败)。你知道哪里出了问题吗?我也不确定我将如何着手添加上面提到的管理要求。我需要管理员(
“Admin”
列中的“True”,即
“Users\u Table”
中的D列)能够查看所有工作表;上面的代码仅供用户使用,显示
“快速添加”
“概述”
并隐藏
“管理”
“用户”
工作表

任何帮助都将不胜感激。谢谢大家!

你知道哪里出了问题吗

代码中有一些错误与您的描述不匹配

这里您将
UsernameTextbox
与列A(
ID
)匹配。用户名是否存在的测试应在B列而不是A列。如果将用户名匹配到用户名B列的
ID
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
Private子登录按钮点击()
'获取用户行,如果找不到,则退出
调光范围
设置r=工作表(“用户”).范围(“用户表”).列(2)_
.Find(UsernameTextbox.text、xlValues、xlWhole)
如果r什么都不是
MsgBox“未找到用户名。”
Me.UsernameTextbox.SetFocus
出口接头
如果结束
如果Me.PasswordTextbox.Value r.Offset(,1).Value2,则
MsgBox“密码错误。”
Me.PasswordTextbox.SetFocus
出口接头
如果结束
'到目前为止,用户和密码都正常
将isAdmin设置为布尔值:isAdmin=r.Offset(,2).Value2
图纸(“快速添加”).Visible=xlSheetVisible
图纸(“概述”)。可见=xlSheetVisible
工作表(“管理”).Visible=IIf(isAdmin、xlSheetVisible、xlSheetHidden)
表(“用户”)。可见=IIf(iAdmin、xlSheetVisible、xlSheetVeryHidden)
端接头

你把事情弄得很复杂。保持简单。试试这个(未经测试)

Private子登录按钮点击()
将用户名设置为字符串
将密码设置为字符串
将passWs设置为工作表
变暗rng As范围
将详细信息设置为布尔值
Username=UsernameTextbox.Text
password=PasswordTextbox.Text
如果Len(Trim(Username))=0,则
UsernameTextbox.SetFocus
MsgBox“请输入用户名”,vbOKOnly,“所需数据”
出口接头
如果结束
如果Len(Trim(password))=0,则
PasswordTextbox.SetFocus
MsgBox“请输入密码”,vbOKOnly,“输入不完整”
出口接头
如果结束
Set passWs=ThisWorkbook.Worksheets(“用户”)
带着passWs
lrow=.Range(“A”&.Rows.Count).End(xlUp).Row
对于i=1至lrow
如果UCase(Trim(.Range(“B”&i.Value))=UCase(Trim(Username)),则“Admin”为True
如果.Range(“D”&i).Value=“True”,则
'
“~~>做你想做的事
'
其他的
'
“~~>做你想做的事
'
如果结束
退出
如果结束
如果结束
接下来我
“~~>用户名/密码不正确
如果CorrectDetails=False,则
MsgBox“无效的用户名/密码”
如果结束
以
端接头
我的假设


在“用户”表中,B列有用户名,C列有密码,D列有管理员值。。如果没有,请根据需要修改上述代码。

!正是我需要的。非常感谢。非常感谢您花时间回复。你的答案很有效,但我同意Siddharth Rout的答案,因为他们的代码更加精简。我会继续和他们一起玩,看看哪一个效果最好。再次感谢。
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
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