所以我在PowerPoint上有一张幻灯片,其中我有一个宏,应该删除所有名称以"element"开头的形状。它确实删除了我想要的形状,但不是全部。我必须再次运行宏,然后它会删除另一堆宏。所以它似乎不是一次全部删除。
有人可以帮助我吗?下面是宏:
Sub course_reset()
Dim shp As Shape
For Each shp In Slide36.Shapes
If Left(shp.Name, 7) = "element" Then shp.Delete
Next
End Sub
造成这种情况的根本原因是迭代的工作方式。 举例说明:
- 假设你处于第 42 位。 此位置的对象符合删除条件。
- 删除对象。 对象 43
- 现在是对象 42,对象 44 是对象 43,依此类推,一直向下,以缩小差距。
- 您现在移动到位置 43,并且跳过了检查旧对象 43。
解决此问题的最简单方法是使用从集合末尾开始的 For 循环。
For i = Slide36.Shapes.Count To 1 Step -1
然后,当您删除时,您将完全绕过间隙闭合。
解决方案
我刚刚通过实验发现,如果我创建一个变量作为 ShapeRange,将其设置为 Slide36.Slides.Range,然后为 ShapeRange 的每个变量执行,它就可以工作了!无论如何,感谢您的快速回复。
所以代码是这样的:
Sub course_reset()
Dim shp As Shape
Dim shprng As ShapeRange
Set shprng = Slide36.Shapes.Range
For Each shp In shprng
If Left(shp.Name, 7) = "element" Then shp.Delete
Next
End Sub