Determining whether an object is a member of a collection in VBA

前端 未结 15 1857
自闭症患者
自闭症患者 2020-11-27 05:35

How do I determine whether an object is a member of a collection in VBA?

Specifically, I need to find out whether a table definition is a member of the TableDe

15条回答
  •  天命终不由人
    2020-11-27 05:58

    this version works for primitive types and for classes (short test-method included)

    ' TODO: change this to the name of your module
    Private Const sMODULE As String = "MVbaUtils"
    
    Public Function ExistsInCollection(oCollection As Collection, sKey As String) As Boolean
        Const scSOURCE As String = "ExistsInCollection"
    
        Dim lErrNumber As Long
        Dim sErrDescription As String
    
        lErrNumber = 0
        sErrDescription = "unknown error occurred"
        Err.Clear
        On Error Resume Next
            ' note: just access the item - no need to assign it to a dummy value
            ' and this would not be so easy, because we would need different
            ' code depending on the type of object
            ' e.g.
            '   Dim vItem as Variant
            '   If VarType(oCollection.Item(sKey)) = vbObject Then
            '       Set vItem = oCollection.Item(sKey)
            '   Else
            '       vItem = oCollection.Item(sKey)
            '   End If
            oCollection.Item sKey
            lErrNumber = CLng(Err.Number)
            sErrDescription = Err.Description
        On Error GoTo 0
    
        If lErrNumber = 5 Then ' 5 = not in collection
            ExistsInCollection = False
        ElseIf (lErrNumber = 0) Then
            ExistsInCollection = True
        Else
            ' Re-raise error
            Err.Raise lErrNumber, mscMODULE & ":" & scSOURCE, sErrDescription
        End If
    End Function
    
    Private Sub Test_ExistsInCollection()
        Dim asTest As New Collection
    
        Debug.Assert Not ExistsInCollection(asTest, "")
        Debug.Assert Not ExistsInCollection(asTest, "xx")
    
        asTest.Add "item1", "key1"
        asTest.Add "item2", "key2"
        asTest.Add New Collection, "key3"
        asTest.Add Nothing, "key4"
        Debug.Assert ExistsInCollection(asTest, "key1")
        Debug.Assert ExistsInCollection(asTest, "key2")
        Debug.Assert ExistsInCollection(asTest, "key3")
        Debug.Assert ExistsInCollection(asTest, "key4")
        Debug.Assert Not ExistsInCollection(asTest, "abcx")
    
        Debug.Print "ExistsInCollection is okay"
    End Sub
    

提交回复
热议问题