我想收集某个组中所有形状的集合。组中的形状可能是一个组本身,所以我(我想)需要一个递归函数来获取每个形状。
这是我的代码:
>>> [34mHello World
但是,我总是会遇到运行时错误:每当我尝试从函数访问集合时(例如在函数本身中),都需要对象
答案 0 :(得分:2)
您的问题开始于这一行:
shapes.Add (subshp) 'Add the subshp to the shape collection
应该是哪个(请注意删除括号):
shapes.Add subshp 'Add the subshp to the shape collection
这里发生的是()
意味着VBA会评估subshp
并将返回默认方法返回的任何内容(例如name或ID)。因此,您不是在集合中添加Shape
,而是添加其他内容(例如String
或Long
)。
此行中的空格使我感到困惑:
Set col = getAllShapes (subshp) 'Get all the shapes from the group
您的VBE应该写为:
Set col = getAllShapes(subshp) 'Get all the shapes from the group
所以这告诉我那里正在发生其他事情。但是,此时代码subshp
是Shape
对象,因此不会引起任何问题。
因此,现在,当您使用以下代码时,VBA正在寻找Shape
,但是您的集合中包含其他内容。这会导致代码行不匹配-从而导致您的错误。
For Each colShp In col 'Error here
shapes.Add (colShp) 'Add all the shapes to the collection
Next colShp
您多久这样做一次?
shapes.Add (subshp) 'Add the subshp to the shape collection
shapes.Add (colShp) 'Add all the shapes to the collection
Else: shapes.Add (shp)
也:无需将两行与“:”连接在一起-这有助于使代码模糊。 他们应该是:
shapes.Add subshp 'Add the subshp to the shape collection
shapes.Add colShp 'Add all the shapes to the collection
Else
,shapes.Add shp
之前的下一行是End If
最后一点,一个好主意是不要将变量(例如“形状”)的名称与现有的通用方法或属性的名称相同-这可能会导致您对使用哪个参数感到困惑。