Excel VBA:为什么“表格”集合不是“集合”?

Excel VBA上的一个简单问题:如果“Sheets”对象是一个集合,为什么下面的语句返回false? (在Inmediate面板中input)

debug.print TypeOf Sheets Is Collection Falso 

我发现它是因为我做了一个以Collection为参数的函数。 该函数与我声明为Collection的variables一起工作,但不适用于其他集合(如Sheets集合)。

也许VBA在inheritance和/或多态性方面失败了?


编辑 :正如JosieP和Mehow所解释的,Sheets集合不是从Collection类/接口inheritance的,所以它不是Collection,不能作为Collection使用多态。

所以现在的问题是:为什么Sheets不是Collection的子类? 为什么他们没有inheritance收集? 考虑到已经在Sheets中实现的方法/属性,它应该是小菜一碟。 正如我所看到的,Collection类/接口只需要4个方法:

 Add Count Item Remove 

而Sheets已经实现了4个类似的方法/属性:

 Add Count Item Delete 

所以映射将是微不足道的。 他们可以很容易地将Sheets集合转换为Collection。


编辑2 :我多谢MS的build议,但是我不会这样做,因为他们可能会说“这不是一个devise错误,它是一个function”:)。 更多思考的食物:在新的工作簿中运行以下代码:

 Sheets.Add.name = "sh2" Sheets.Add.name = "sh3" Dim col As Collection Set col = New Collection col.Add Sheets(1) col.Add Sheets(2) col.Add Sheets(3) For Each ele In col Debug.Print "ele in col: " & ele.name Next ele For Each ele In Sheets Debug.Print "ele in Sheets: " & ele.name Next ele 

对于我来说,“col”和“Sheets”都可以用同样的方式迭代,对于每个循环都是一样的,但是它们并不共享一个通用接口。 如果我必须devise这些类,层次将是:

  iIterable (interface) | | iCollection (interface) / \ / \ / \ Collection cSheets (classes) 

而Sheets将是cSheets类的一个对象(实例)。

通过这种方式,我所做的function(当前使用Collection参数)将采用iCollection参数,因此可以同时使用Collection实例和Sheets。

SheetsObjecttypes的集合,而不是Collectiontypes的对象。

就像JosieP说的那样

Sheets类不会从VBA集合inheritance,也不会实现Collection接口(例如没有Remove方法)

应该足够了解。

MSDN参考

在这里输入图像说明

 Sub Main() Dim c As Collection Set c = New Collection Debug.Print VarType(c), TypeOf c Is Collection Debug.Print VarType(Sheets), TypeOf Sheets Is Object End Sub 

确认用F2打开Object Browser并input查找Sheets


向Microsoft提出第二个问题。 但是请记住, Collection可以是空的,而Sheets总是需要至less有一个Sheets或Chart对象。

很多东西都依赖于Excel中的Sheets集合对象,这就是为什么我认为它必须是一个单独的类。 通过实现ICollection接口和提供一个单独的实现,我看不出没有错,但正如我所说的问微软(好问题)


for each循环都是可能的,因为每个VBA类都有属性 。 不是所有的属性都可以通过IDE来看到,但是它们确实存在(更多的是VB6的常识而不仅仅是参考VBA)。

好的,现在回答你的第三个问题。 你可以迭代一个集合,因为它实现了IUnknown接口NewEnum()enumarable method )。 您可以在types的集合上指定默认的迭代对象(在Sheets案例的Sheets集合中)。

请参阅此链接以获取有关可枚举方法的更清晰的解释。

看到这个答案,以更好地了解如何迭代是可能的。