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似乎不起作用.
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分配Long
给Object
:
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有关.