VISIO VBA获取一组中所有形状的集合

时间:2018-07-28 15:19:24

标签: vba ms-office visio

我想收集某个组中所有形状的集合。组中的形状可能是一个组本身,所以我(我想)需要一个递归函数来获取每个形状。

这是我的代码:

>>> [34mHello World

但是,我总是会遇到运行时错误:每当我尝试从函数访问集合时(例如在函数本身中),都需要对象

1 个答案:

答案 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,而是添加其他内容(例如StringLong)。

此行中的空格使我感到困惑:

Set col = getAllShapes (subshp) 'Get all the shapes from the group

您的VBE应该写为:

Set col = getAllShapes(subshp) 'Get all the shapes from the group

所以这告诉我那里正在发生其他事情。但是,此时代码subshpShape对象,因此不会引起任何问题。

因此,现在,当您使用以下代码时,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
  • Elseshapes.Add shp之前的下一行是End If

最后一点,一个好主意是不要将变量(例如“形状”)的名称与现有的通用方法或属性的名称相同-这可能会导致您对使用哪个参数感到困惑。