确定对象是否为VBA中集合的成员

时间:2020-03-06 14:45:59  来源:igfitidea点击:

如何确定对象是否是VBA中集合的成员?

具体来说,我需要找出一个表定义是否是TableDefs集合的成员。

解决方案

最好的选择是遍历集合中的成员,然后查看是否与我们要查找的内容匹配。相信我,我已经做过很多次了。

第二种解决方案(更糟糕的是)是捕获"项目不在集合中"错误,然后设置一个标志以表明该项目不存在。

在特定情况下(TableDefs),遍历集合并检查Name是一个好方法。可以,因为集合的键(名称)是集合中类的属性。

但是在VBA集合的一般情况下,键不一定是集合中对象的一部分(例如,我们可以将集合用作字典,而键与集合中的对象无关)。在这种情况下,我们别无选择,只能尝试访问该项目并捕获错误。

并不是很优雅,但是我能找到的最好的(也是最快的)解决方案是使用OnError。对于任何大中型集合,这将比迭代快得多。

Public Function InCollection(col As Collection, key As String) As Boolean
  Dim var As Variant
  Dim errNumber As Long

  InCollection = False
  Set var = Nothing

  Err.Clear
  On Error Resume Next
    var = col.Item(key)
    errNumber = CLng(Err.Number)
  On Error GoTo 0

  '5 is not in, 0 and 438 represent incollection
  If errNumber = 5 Then ' it is 5 if not in collection
    InCollection = False
  Else
    InCollection = True
  End If

End Function

不够好吗?

Public Function Contains(col As Collection, key As Variant) As Boolean
Dim obj As Variant
On Error GoTo err
    Contains = True
    obj = col(key)
    Exit Function
err:

    Contains = False
End Function