Excel 验证集合中的唯一密钥

Excel 验证集合中的唯一密钥,excel,collections,key,vba,Excel,Collections,Key,Vba,我正在尝试验证VBA集合的密钥在集合中是否不存在。我使用一个UNIX帐户列表作为我的密钥,我已经验证了它是唯一的。然后,我迭代了一系列包含用户数据的工作表。由于数据的布局,我运行了一个双通道系统,一个用于选择用户名,另一个用于关联记录中没有用户名的数据。当我在第一次传递时添加用户名时,有时它会抛出一个错误,指出密钥已经存在于集合中 Public Function ContainsKey (key as String) Dim retVal as Boolean Dim recor

我正在尝试验证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
我最近克服这个错误的尝试如下:注意:account是我编写的用来存储所有信息的类,Accounts是集合

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
我已经一步一步地浏览了代码,直到出现错误,if语句从未执行过,但它仍然抱怨有重复的密钥。我不理解集合发生了什么,为什么在将重复项添加到集合之前检查重复项时会抛出重复键错误

非常感谢您的任何帮助!提前感谢大家的帮助

谢谢,
Jeremy

此代码假定帐户是一个简单的集合

        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
公共函数包含SKEY2(键作为字符串)作为整数
出错时继续下一步
帐户。添加密钥,密钥
ContainsKey2=(错误=457)
如果出现错误0和错误457,则MsgBox Err&“”&Err.Description
端函数

要添加到我的评论和@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
子测试仪()
尺寸c为新系列,x为长系列
将v作为对象
对于x=1到10
c、 添加ActiveSheet.Cells(x,1),“Cell”和x
下一个x
出错时继续下一步
v=c.Item(“Cell4”)缺少Set关键字
调试.打印错误号,错误说明
“91”对象变量或未设置块变量
如果错误号为0,则清除错误
Set v=c。假设存在密钥,则项(“Cell4”)应正常工作
调试.打印错误号,错误说明
'0
如果错误号为0,则清除错误
Set v=c.Item(“Cell33”)不存在键
调试.打印错误号,错误说明
“5”过程调用或参数无效
如果错误号为0,则清除错误
c、 添加ActiveSheet.Cells(x,11),“Cell5”添加重复键
调试.打印错误号,错误说明
“457”此键已与此集合的元素关联”
端接头

设置记录=Account.item(key)
因为记录是一个对象变量。。。如果不检查错误号,则无法区分原因。。。另见:哇,我真不敢相信我忘了“布景”。我仍然停留在C/Java的思维模式中。@Madvilla你读过这些评论了吗+1蒂姆:我确实读过,但直到现在我还没有完全理解“下一步继续出错”的重要性。这使我能够访问if语句并指定正确的返回值。哦,最后我确实改变了一些条件使它工作。谢谢你,蒂姆!谢谢你的回答。解决方案确实在这里,但我只是后来才看到。谢谢你的帮助!