当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《确定对象是否是VBA中集合的成员》经验,为你挑选了4个好方法。

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

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



1> Vadim..:

不够好吗?

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


如果键的值是对象而不是基元,则这不起作用 - 如果值是对象,则会得到赋值错误(对象引用需要使用"Set"赋值),因此返回"False"甚至如果密钥存在.用obObject(col(key))替换obj = col(key)行来处理对象和原始值.
这是一个很好的解决方案,成千上万的人必须重新实现它才有点愚蠢.VB/VBA应该比这更高.

2> Mark Nold..:

不完全优雅,但我能找到的最好(也是最快)的解决方案是使用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


我不认为这是非优雅的...它是一种尝试捕获的方法,在C++和Java中非常正常,例如我认为迭代整个集合的速度要快得多,因为VB计算了提供的哈希值键,并在哈希表上搜索,而不是在项目的集合中搜索.
这个实现不合适:即如果发生#5以外的任何其他错误,它将返回True
errNumber在这里不是5,它是3265而不是:( ...从这方面来说它不优雅 - 依赖于硬编码的错误代码

3> Gilligan..:

您最好的选择是迭代集合的成员,看看是否匹配您正在寻找的东西.相信我,我必须多次这样做.

第二个解决方案(更糟糕的是)捕获"Item not in collection"错误,然后设置一个标志,表示该项目不存在.


这真的是唯一的方法吗?
说实话,我发现Access本身作为一般的编程平台并不令人满意.但我们必须玩我们处理的牌.:-)
也许"正确",但仍然非常不满意.谢谢两位.
Mark Nold在下面提供的解决方案要优越得多
VB6/VBA集合不仅仅是你可以迭代的东西.它还提供可选的密钥访问.

4> ZygD..:

这是一个老问题.我仔细阅读了所有答案和评论,测试了性能解决方案.

我想出了我的环境中最快的选项,当集合包含对象和基元时,它不会失败.

Public Function ExistsInCollection(col As Collection, key As Variant) As Boolean
    On Error GoTo err
    ExistsInCollection = True
    IsObject(col.item(key))
    Exit Function
err:
    ExistsInCollection = False
End Function

此外,该解决方案不依赖于硬编码的错误值.因此参数col As Collection可以被其他一些集合类型变量替换,并且该函数仍然可以工作.例如,在我目前的项目中,我会将其作为col As ListColumns.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有