使用Excel生成Visio图表 - 使用'选择' IF语句中的方法

时间:2017-02-22 15:00:34

标签: vba visio visual-studio-macros visio-vba

我目前正在将Excel与Visio集成,以图解方式自动填充一些元素。到目前为止,我已经完成了这项工作,但却陷入了文档,宏录制和实际做我想要的事情之间。

通过录制宏,我找到了一种选择单个元素的方法: 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),这可以按预期工作。但是我在工作表上留下了许多形状,例如名称为&#34; Ethernet.46&#34;的形状。我不知道为什么删除某些形状以及删除页面背景的原因。我发现如果我运行一次For循环,将背景添加回WITH vsoDocument.Pages(sitePage).BackPage,然后再次运行我的For循环5次,最后删除所有形状。

问题:为什么我的For循环行为不可靠?

1 个答案:

答案 0 :(得分:3)

  

.Select行失败,我很确定这是oItem.Item调用失败的

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

  

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

可能如下:

vsoDocument.Application.ActiveWindow.Select oItem, visSelect 

但是,您提供的代码并不清楚:为什么需要Select形状?通常这不是必需的。可以在不依赖Select的情况下做你想做的事。

  

我有没有办法自己捕获这些信息?例如我可以揭示与oItem定义相关的方法,比如“Name”吗?

您可以使用VBE中的“本地”窗格查看与每个对象关联的属性,并且可以查看属性和属性。文档中的方法(通常包括语法示例和使用)或VBE中的方法按 F2 以显示对象浏览器。

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

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

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

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

<强>更新

始终在从集合中删除元素时,必须通过索引以相反的顺序执行此操作。

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。通过索引强制循环,并以相反的顺序,防止这种不期望的行为。