Powerpoint VBA 循环不遍历所有幻灯片

Powerpoint VBA Loop not looping through all slides

有点问题,我有一些 VBA 代码循环遍历我的 ppt 中的所有工作表,循环遍历每个 ppt 中的所有形状,并在出现特定文本字符串时删除 ppt没有找到。除了代码似乎无缘无故停止循环外,它似乎工作得很好。我必须按 F5 大约 4 次,代码才能循环遍历所有工作表。这可能与我的代码有关,所以我想我会先尝试 Whosebug 的好人。

Public Sub ExportMBR()
Dim oSld As Slide
Dim oShp As Shape
Dim strSearch As String
Dim i As Integer

strSearch = "R&T MBR"
i = 0

For Each oSld In ActivePresentation.Slides
    Debug.Print (ActivePresentation.Slides.Count)
    Debug.Print (oSld.Name)
    For Each oShp In oSld.Shapes
        If oShp.HasTextFrame Then
            If oShp.TextFrame.TextRange.Find(strSearch) Is Nothing Then
            Else
                Debug.Print (oSld.Name & " Slide found")
                i = i + 1
            End If
        End If
    Next oShp
    If i = 0 Then
        Debug.Print (oSld.Name & " Deleting")
        oSld.Delete
        i = 0
    End If
    i = 0
Next oSld

myQ = "<afilepath>"
myName = myQ & "<anameformat>") & ".pptx"
ActivePresentation.SaveCopyAs myName

Call Shell("explorer.exe " & myQ, vbNormalFocus)

End Sub

我的 ppt 中有 34 张幻灯片,每张 运行 将循环播放大约 7 张幻灯片,正确识别和删除我不需要的幻灯片,但如果没有任何错误,它将停止循环并继续执行其余的代码。如果这有所不同,则可以在幻灯片 17 和 18 上找到该字符串。我已经添加了一些额外的内容来尝试解决 debug.prints 和 i = 0 之类的问题,但我无法弄清楚我做错了什么。

非常感谢!

ppw

因为Find(strSearch) & oSld.Delete在同一个循环,所以需要分开!! 先解决要删除的幻灯片,然后删除它们。

例如:假设您有 slide_1 & slide_2 & slide_3 并且您想删除 slide_1 & slide_2 & slide_3.实际上,你的 VBA 只是 del slide_1 & slide_3。

在循环For Each oSld In ActivePresentation.Slides中,查找序列应该是slide_1 => slide_2 => slide_3。但是,第一个循环周期会删除 slide_1,剩余的幻灯片计数变为 2(slide_2 & slide_3),因此第二个循环周期将从 slide_3 开始。这就是为什么。

每当您在循环遍历该集合中的每个对象时删除该集合中的任何对象,您都需要倒数。因此,在这些情况下,您不能使用 For Each oSld In ActivePresentation.Slides 语句,而是这样做:

Dim lCntr as Long
Dim oSld as Slide
For lCntr = ActivePresentation.Slides.Count to 1 Step -1
  Set oSld = ActivePresentation.Slides(lCntr)
  ' Do your stuff here...
  Set oSld = Nothing
Next

http://youpresent.co.uk

下载更多免费的 PowerPoint 宏和加载项