2015-11-04 68 views
0

我试图创建一个多用户登录。我有一个专门用于用户名和密码的单元格的欢迎表,以及一个包含用户名和密码组合的表单。登录多个用户

我得到一个错误If wk.Range("B3").Value = ws.Range(i, "A").Value Then 它说“对象定义”的错误。

我认为它是有道理的,只是试图检查单元格中的字符串是否通过循环匹配用户表中的用户名/密码。 我不确定是否正确。然后根据您是否以操作员或其他用户身份登录,它会影响您看到的表单。

Public CurrentUser As String, CurrentRole As String, LoginUserName As String, LoginPassword As String 
Public LoginStatus As Boolean 

Sub Login() 
'Worksheets("Users").Activate 
Dim numberOfUsers, i As Integer 
Dim ws, wk As Worksheet 
Set ws = ThisWorkbook.Worksheets("Users") 
Set wk = ThisWorkbook.Worksheets("Welcome") 

numberOfUsers = ws.Range("Users").Rows.Count 
LoginStatus = False 


For i = 1 To numberOfUsers 
If wk.Range("B3").Value = ws.Range(i, "A").Value Then 
    If wk.Range("B4").Value = ws.Range(i, "B").Value Then 
    CurrentUser = wk.Range("B3").Value 
    LoginStatus = True 
    Else 
    LoginStatus = False 
    MsgBox ("Wrong Login Data") 
    End If 
Else 
LoginStatus = False 
MsgBox ("Wrong Login Data") 
Next i` 

Select Case CurrentUser 
    Case "Operator" 
    Worksheets("Received_Calls").Visible = True 
    Worksheets("Welcome").Visible = False 
    Worksheets("Users").Visible = False 
    Worksheets("Reported_actions").Visible = False 
    Worksheets("Parameters").Visible = False 
    Worksheets("Distances").Visible = False 
    Worksheets("NewCalls").Visible = False 
    Worksheets("NewActions").Visible = False 
Case Else 
    Worksheets("Received_Calls").Visible = False 
    Worksheets("Welcome").Visible = False 
    Worksheets("Users").Visible = False 
    Worksheets("Reported_actions").Visible = True 
    Worksheets("Parameters").Visible = False 
    Worksheets("Distances").Visible = False 
    Worksheets("NewCalls").Visible = False 
    Worksheets("NewActions").Visible = False 
'need to filter 
End Select 
End Sub 
+0

你不想看表到工作表,而不是工作簿到工作表?看来你已经有点错字:。wk.Range( “B3”)值= ws.Range(I, “A”)的价值应该是ws.Range( “B3”)值= ws.Range(我,“A”)。价值 – sous2817

+0

你也可以避开环路通过在用户工作表的列C串联您的用户名和密码一起使用匹配函数... – sous2817

+0

souldn't'ws.Range(I,“A” ).Value'是'ws.Range(“A”&i).Value'或'ws.Cells(i,1).Value' –

回答

0

我不能发表评论,但(小于50代表),所以我把这个答案,但我想解决上述一个评论者:

sous2817 - 无论是周和WS是标注为工作表,所以比较是正确的。

我们的答案:

正如德克国,工作簿 .Range()函数有两个参数,但他们都应该是字符串格式的单元格地址,而如果两者都提供,范围返回将包括它们之间的所有单元格。您有:

ws.Range(i, "A").Value 

这是告诉Excel来获得小区i和小区“A”,并得到所有细胞之间的正方形。这是行不通的,因为没有为“A”没有这样的细胞(你会提到一个列“A:A”)和可变将计算为一个数字(又没有这样的地址为1,2,3,等等,只有 “1:1” 等)

你需要什么来改变这是因为德克说:

ws.Range("A" & i).value 

与号(&)充当串接,并且将创建用于循环的每次迭代的字符串,评估成A1,A2,A3等

您需要对引用列B的Range函数也做同样的事情。

说了这么多,一个更好的解决方案将得不到正确答案被sous2817在他们的第二个评论中,你可以这样做:

Dim userCell as Range 
Set userCell = ws.Range("Users").Resize(,1).Find(wk.Range("B3").Value) 
If userCell is nothing then 
    'Username is invalid code goes here 
Elseif wk.Range("B4").Value = userCell.offset(,1).value then 
    'Password is valid 
Else 
    'Password is invalid 
End If 

如FindWindow函数说明,您可以先检查是否已在此展开提供的用户名与Application.UserName匹配,以查看它是否是当前的Windows用户。

希望这会有所帮助!