删除形状宏需要 运行 两次才能工作

Delete Shape Macro needs to be run twice to work

我有这个 PPT vba 脚本可以删除每张幻灯片左下角区域中的所有形状。它有效,但有时会在该区域留下一个形状。如果我再次 运行 它会摆脱它,但我不想 运行 它两次!我该如何解决这个问题?

Sub GoAwayDumbText()
 Dim oPres As Presentation
 Dim oSlides As Slides
 Dim oSld As Slide
 Dim oShp As Shape
 Dim PathSep As String
 Dim sTempString As String

#If Mac Then
PathSep = ":"
#Else
PathSep = "\"
#End If

Set oPres = ActivePresentation
Set oSlides = oPres.Slides

For Each oSld In oSlides
For Each oShp In oSld.Shapes
    If oShp.Left <= 135 And oShp.Top >= 260 Then
    oShp.Delete
    Else
    End If
Next oShp

Next oSld

End Sub

当您遍历 collection(形状、幻灯片等)并沿途删除项目时,For/Each 循环不会按预期运行。

相反,使用(在这种情况下)

对于 x = oSld.Shapes.Count 到 1 步 -1

删除从collection结尾到开头而不是从开头到结尾。

为什么?

假设您在 collection 中有三个项目:

VBA 以其内部 For/Each 计数器设置为 1 开始 第一项符合您的条件,您将其删除 VBA 将其内部 For/Each 计数器递增到 2 由于您删除了一项,因此 collection 中只剩下两项,因此 VBA 查看第二项(曾经是第三项)并将其删除。 VBA 将其内部计数器增加到 3,但是您删除了三个原始项目中的前两个,因此 collection 中只有 1 个项目;没有第 3 项,所以以前的第 3 项从来没有人看过。

[如果有人可以对此提供 better/clearer 解释,请接受。]