例如,当使用集合里一个并不存在的索引来调用Item 方法的时候,Collection对象就会出现问题。你可能考虑使用一个不会出现问题的对象来替换掉这个对象。
在创建了一个叫做Collection的新的类模块之后,向其加入下面的代码:
Dim objCollection As VBA.Collection
Public Sub Add(Item As Variant, Optional Key As Variant, _
Optional
Before As Variant, Optional After As Variant)
Call objCollection.Add(Item, Key, Before, After)
End Sub
Public Function Count() As Long
Count = objCollection.Count
End Function
Public Function Item(ByVal Index As Variant) As Variant
On Error Resume Next
Item = objCollection.Item(Index)
End Function
Public Function Remove(ByVal Index As Variant)
Call objCollection.Remove(Index)
End Function
Public Function NewEnum() As IUnknown
Set NewEnum = objCollection.[_NewEnum]
End Function
Private Sub Class_Initialize()
Set objCollection = New VBA.Collection
End Sub
Private Sub Class_Terminate()
Set objCollection = Nothing
End Sub
在加入这段代码之后,在Visual Basic 6的菜单里选择工具(Tools)| 过程的属性(Procedure Attributes)选项。这会显示一个过程属性的对话框。选择名称(Name)下拉菜单里的NewEnum方法,然后在过程ID(Procedure ID)字段里输入-4,再勾选隐藏该成员(Hide This Member)。这就会激活For Each..Next的功能。
现在,当你的代码创建一个新的Collection类时,它就会去参照那个自定义的类。如果要参照原来的Collection类,那么你就必须使用组件名来给其加上前缀。
Dim objCollection As VBA.Collection
这个技巧对于在Visual Basic里通过扩展对象来更改已有功能或者加入新的方法很有用。但是,如果真的使用了这项技巧,你就应该仔细地做好文档工作,以避免对使用的是哪个对象产生误解。