检查密钥是否在Excel VBA中的集合中的通用方法

use*_*240 10 excel vba excel-2010

我的代码中有不同的集合.有些持有对象(各种类型),其他有类型(如Long).

有没有办法检查Collection中是否包含适用于类型和对象的键?

到目前为止,我有两个功能.

第一个功能:

Private Function ContainsObject(objCollection As Object, strName As String) As Boolean
    Dim o As Object
    On Error Resume Next
    Set o = objCollection(strName)
    ContainsObject = (Err.Number = 0)
    Err.Clear
End Function
Run Code Online (Sandbox Code Playgroud)

第二功能:

Private Function ContainsLong(AllItems As Collection, TheKey As String) As Boolean
    Dim TheValue As Long
    On Error Resume Next
    TheValue = AllItems.Item(TheKey)
    ContainsLong = (Err.Number = 0)
    Err.Clear
End Function
Run Code Online (Sandbox Code Playgroud)

这两个函数的原因是如果我传递一个具有Longs对的Collection(函数总是返回False),ContainsObject似乎不起作用.

PS:第一个功能是来自Test的第三个答案的副本或检查表是否存在

Rob*_*zie 16

你应该Variant在第一个函数中使用a .你可以指定Object一个Variant,例如,这不会错误:

Sub Test()
    Dim var As Variant
    Dim obj As Object
    Set obj = Application
    var = Application
    Debug.Print var
End Sub
Run Code Online (Sandbox Code Playgroud)

但这会产生Type Mismatch编译错误,即尝试将a分配LongObject:

Sub Test()
    Dim obj As Object
    Dim lng As Long
    lng = 3
    Set obj = lng
End Sub
Run Code Online (Sandbox Code Playgroud)

因此,对于通用函数(沿着代码行)来检查Collection密钥是否有效,您可以使用:

Function HasKey(coll As Collection, strKey As String) As Boolean
    Dim var As Variant
    On Error Resume Next
    var = coll(strKey)
    HasKey = (Err.Number = 0)
    Err.Clear
End Function
Run Code Online (Sandbox Code Playgroud)

测试代码:

Sub Test()
    Dim coll1 As New Collection
    coll1.Add Item:=Sheet1.Range("A1"), Key:="1"
    coll1.Add Item:=Sheet1.Range("A2"), Key:="2"
    Debug.Print HasKey(coll1, "1")

    Dim coll2 As New Collection
    coll2.Add Item:=1, Key:="1"
    coll2.Add Item:=2, Key:="2"
    Debug.Print HasKey(coll2, "1")
End Sub
Run Code Online (Sandbox Code Playgroud)

MSDN上有一篇关于此的有用文章.上下文是VB6,但与VBA有关.