我目前正在将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循环行为不可靠?
答案 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。通过索引强制循环,并以相反的顺序,防止这种不期望的行为。