升级VBA 6->;7原因错误:如果集合中存在

升级VBA 6->;7原因错误:如果集合中存在,vba,collections,Vba,Collections,VBA6代码(Excel)工作得很好。升级到Office 2010/VBA7,代码中断 使用SO的代码: 我得到运行时错误5:过程调用或参数无效 但这对我来说没有意义,因为错误发生在obj=col(key)行上,该行应该由on error GoTo err语句覆盖,但它停止了 如果集合类型解决方案中存在X,则其他解决方案也存在相同的问题 我真正需要的不是修复损坏的代码,而是能够看到是否已经为集合设置了记录,如果可以用VBA7中的其他(新)方法来完成,这也可以解决问题(我可以做梦)。我发现,如果

VBA6代码(Excel)工作得很好。升级到Office 2010/VBA7,代码中断

使用SO的代码:

我得到运行时错误5:过程调用或参数无效

但这对我来说没有意义,因为错误发生在
obj=col(key)
行上,该行应该由
on error GoTo err
语句覆盖,但它停止了

如果集合类型解决方案中存在X,则其他解决方案也存在相同的问题


我真正需要的不是修复损坏的代码,而是能够看到是否已经为集合设置了记录,如果可以用VBA7中的其他(新)方法来完成,这也可以解决问题(我可以做梦)。

我发现,如果我更改指定对象,例如工作表,它可以工作:

Public Function Contains(col As Collection, key As Variant) As Boolean
Dim ws As Excel.Worksheet

On Error GoTo err
Contains = True
Set ws = col(key)
Exit Function
err:
Contains = False
End Function
我这样称呼它:

Sub test()
Dim ws As Excel.Worksheet
Dim coll As Collection

Set coll = New Collection
For Each ws In ThisWorkbook.Worksheets
coll.Add ws, ws.Name
Next ws
Debug.Print Contains(coll, ActiveSheet.Name)
Debug.Print Contains(coll, "not a worksheet name")
End Sub

第一次呼叫为真,第二次呼叫为假。

在您的问题(循环)中的链接下的批准答案中提供的解决方案如何…作为临时(?)解决方法,我在接下来的错误恢复中加入了
就在收集检查之前,一切似乎正常,但这让我感到紧张。这是回避问题,因此不是真正的答案,但我更喜欢
脚本编写。Dictionary
对象,因为它们具有内置的
.exists()
调用。对于我的许多函数,它们似乎也运行得更快。我认为在您的情况下,
Set
关键字比对象规范更重要,不是吗+1对于您:)将
Dim obj更改为Variant
Dim obj更改为Excel。工作表
也不起作用。我只是试了一下你的代码,却得到了同样的错误。开始认为这不是代码和其他配置。我检查了参考资料,检查了4个:VBA、Excel 14.0、OLE自动化、Office 14。0@KazJaw谢谢在我看来,它们是紧密联系在一起的,也就是说,你不能设置一个变量。@MECU,我只是想澄清一下,直到我做了更改(Excel 2010),这个函数才适用于我的工作表。虽然我没有得到运行时错误,但不管怎样都是错误的,所以听起来好像还有其他事情在发生。@Douglancy您是否建议使用泛型
对象
(或其他类型)来获得更灵活的解决方案(例如,不同类型的集合/不同类型的多个集合)?或者您会建议每个集合类型使用一个
包含
函数吗?
Sub test()
Dim ws As Excel.Worksheet
Dim coll As Collection

Set coll = New Collection
For Each ws In ThisWorkbook.Worksheets
coll.Add ws, ws.Name
Next ws
Debug.Print Contains(coll, ActiveSheet.Name)
Debug.Print Contains(coll, "not a worksheet name")
End Sub