使用 Excel 生成 Visio 图表 - 在 IF 语句中使用'select'方法



我当前正在与Visio集成Excel,以自动填充某些元素。这项工作已经很远了,但是在文档,宏录制和实际做我想做的事情之间陷入了困境。

通过录制宏,我找到了一种选择这样的单个元素的方法: ActiveWindow.Select Application.ActiveWindow.Page.Shapes.ItemFromID(216), visSelect

我的脚本中有一个循环,如下所示:

For Each oItem In vsoDocument.Pages(sitePage).Shapes
    If oItem.Name <> "Sheet.2" Then
        'vsoDocument.Pages(sitePage).Select oItem.Item, visSelect ' NOW REMOVED
        oItem.DeleteEx (visDeleteNormal)
        Debug.Print oItem.Name
    End If
Next oItem

更新:根据您的响应和理智检查,您不需要选择形状。我已经修改了代码,以简单地显示oItem.DeleteEx (visDeleteNormal),这可以按预期工作。但是,我的工作表上有许多形状,例如一个名称为"以太网"的形状。46。我不知道为什么会删除某些形状,也不知道为什么要删除页面背景。我发现,如果我运行一次循环,请与vsoDocument.Pages(sitePage).BackPage一起添加背景,然后再连续运行5次循环,最终删除了所有形状。

问题:为什么我的循环表现不错?

选择线路失败,我很确定是oitem.item呼叫失败的

Select线失败,因为Page对象没有Select方法。这与Window对象有关。从DOX中,看起来oItem.Item也会失败,因此您可能只能使用oItem本身就是Shape对象。

此循环中此命令的正确语法是什么?

可能如下:

vsoDocument.Application.ActiveWindow.Select oItem, visSelect 

但是,从您提供的代码中尚不清楚:为什么需要Select形状?通常这是不需要的。可能完全不依赖Select,可以做您想做的事情。

我本人可以钓鱼这些信息吗?例如我可以揭示与OITEM定义相关的方法,例如"名称"?

您可以使用VBE中的当地窗格查看与每个对象关联的属性,您可以查看属性&amp;来自文档(通常包括语法示例&amp; use)的方法或vbe press f2 中以启动对象浏览器。

您可以浏览Visio对象模型,此处:

http://msdn.microsoft.com/en-us/library/office/ff765377.aspx

浏览该层次结构,您可以浏览Shape对象的事件,属性和方法:

https://msdn.microsoft.com/en-us/library/office/ff768546.aspx

update

始终从集合中删除元素时,必须按索引和相反的顺序进行此操作。

Dim i as Long
For i = vsoDocument.Pages(sitePage).Shapes.Count to 1 Step - 1
    Set oItem = vsoDocument.Pages(sitePage).Shapes(i)
    If oItem.Name <> "Sheet.2" Then
        Debug.Print oItem.Name
        oItem.DeleteEx (visDeleteNormal)
    End If
Next oItem

这是必要的原因,是因为当您 Delete一个项目时,集合会重新索引自己,因此当您删除项目#1时,则项目#2成为第一个索引,但是您的循环将您带到 Next 项目,现在是项目#3。通过索引强迫循环,并以相反的顺序防止这种不希望的行为。

最新更新