2015-11-04 100 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用戶。

希望這會有所幫助!