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
下载更多免费的 PowerPoint 宏和加载项
有点问题,我有一些 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
下载更多免费的 PowerPoint 宏和加载项