2013-11-25 280 views
0

驗證唯一鍵我試圖驗證的VBA集合的關鍵並不在集合中已經存在。我使用UNIX帳戶列表作爲我的密鑰,我已經驗證了它是唯一的。然後我遍歷一系列包含用戶數據的表單。由於數據是如何佈置的,我運行了一個兩通系統,一個選擇用戶名,第二個系統關聯記錄中沒有用戶名的數據。當我第一遍添加用戶名時,有時候會出現錯誤,說明集合中已存在該密鑰。在收集

我克服這種錯誤最近一次嘗試如下:注意:帳戶是一類我寫來存儲所有的信息,和帳務集合。

Public Function ContainsKey (key as String) 
    Dim retVal as Boolean 
    Dim record as account 

    retVal = False 

    On Error GoTo Finish 
    record = Account.item (key) 

    If not record = Empty Then 
     retVal = True 
    End If 

Finish: 

    ContainsKey = retVal 
End Function 

我已經通過代碼加強一路走過來的錯誤,並且如果從未執行的語句,但它仍然complaning關於重複鍵。我沒有承認收集過程中發生了什麼,爲什麼當我在將它們添加到集合中之前檢查重複的時候,它會拋出重複的關鍵錯誤。

任何及所有的幫助深表感謝!預先感謝您的幫助。

感謝, 傑里米

+0

'Set record = Account.item(key)'因爲記錄是一個對象變量......如果你不檢查錯誤號,你不能區分從另一封原因另請參見:http://stackoverflow.com/questions/137845/determining-whether-an-object-is-a-member-of-a-collection-in-vba –

+0

哇,我可以我相信我忘了這個「套」。我仍然堅持C/Java思想。 – Madviola

回答

1

添加到我的評論和@ rheitzman的答案 - 你的錯誤數量取決於究竟是什麼原因造成的錯誤,所以你需要檢查:

Sub Tester() 
Dim c As New Collection, x As Long 
Dim v As Object 

    For x = 1 To 10 
     c.Add ActiveSheet.Cells(x, 1), "Cell" & x 
    Next x 

    On Error Resume Next 

    v = c.Item("Cell4") 'missing Set keyword 
    Debug.Print Err.Number, Err.Description 
    '91 "Object variable or With block variable not set" 
    If Err.Number <> 0 Then Err.Clear 

    Set v = c.Item("Cell4") ' should work OK assuming key exists 
    Debug.Print Err.Number, Err.Description 
    '0 
    If Err.Number <> 0 Then Err.Clear 

    Set v = c.Item("Cell33") 'non-existent key 
    Debug.Print Err.Number, Err.Description 
    '5 "Invalid procedure call or argument" 
    If Err.Number <> 0 Then Err.Clear 

    c.Add ActiveSheet.Cells(x, 11), "Cell5" 'add duplicate key 
    Debug.Print Err.Number, Err.Description 
    '457 "This key is already associated with an element of this collection" 

End Sub 
+0

這是一個457錯誤。 – Madviola

+0

@Madviola你看過評論嗎? +1蒂姆偉大的示範 – 2013-11-26 14:54:38

+0

我看過,但我沒有完全理解「未來的錯誤恢復」的重要性,直到剛纔。這允許我去if語句並分配正確的返回值。哦,而且我確實最終改變了一些條件以使其工作。謝謝蒂姆! – Madviola

0

此代碼假定帳戶是一個簡單的集合

 Public Function ContainsKey2(key As String) As Integer 
     On Error Resume Next 
      account.Add key, key 
      ContainsKey2 = (Err = 457) 
      If Err <> 0 And Err <> 457 Then MsgBox Err & " " & Err.Description 
     End Function 
+0

謝謝你的回答。解決方案確實在這裏,但直到後來我纔看到它。感謝您的幫助! – Madviola