2013-04-26 124 views
4
已存在

VBA6代码(EXCEL)伟大的工作。升级到Office 2010/VBA7,代码中断。升级VBA 6-> 7的原因错误:如果集合

使用代码从SO:

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

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 

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

这对我来说没有任何意义,但是因为obj = col(key)行上出现错误,应该由On Error GoTo err语句覆盖,但它会停止。

其他如果X存在于收集型解决方案有同样的问题。

而不是修复破损的代码,我真正需要的是能够查看是否已经为一个集合设置了一个记录,如果可以在VBA7中做一些其他(新的)方式,那就可以解决问题(我可以梦想)。

+0

如何解决方案在已批准的答案中提供的问题(循环)中放入的链接中... – 2013-04-26 19:53:18

+0

作为一种临时解决方案,我在前面提供了“On Error Resume Next”收集检查和事情似乎没问题,但这让我感到紧张。 – MECU 2013-04-26 20:12:15

+2

这是侧步进问题,所以不是一个真正的答案,但我更喜欢'Scripting.Dictionary'对象,而不是,那些具有一个内置'.exists()'调用。对于我的许多功能,他们似乎也跑得更快。 – Gaffi 2013-04-26 20:15:58

回答

2

我觉得,如果我改变指定的对象,例如,一个worsheet,它的工作原理:

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 

我得到真正的第一个呼叫,第二个假。

+0

我认为在你的情况下'Set'关键字比对象规范更重要,不是吗? +1无论如何:) – 2013-04-26 19:58:23

+0

更改'Dim obj As Variant'和'Dim obj As Excel.Worksheet'也无法正常工作。我试着只是你的代码,并得到相同的错误。开始认为这不是代码和其他配置。我没有检查参考4检查:VBA,Excel 14.0,OLE自动化,Office 14.0 – MECU 2013-04-26 20:07:30

+0

@KazJaw,谢谢。对我来说,他们是携手并进的,也就是说,你不能设置一个变体。 – 2013-04-26 20:08:00