Powerpoint VBA循环未在所有幻灯片中循环
有一点问题,我有一些VBA代码,可以循环浏览ppt中的所有图纸,循环浏览每个ppt中的所有形状,如果找不到特定的文本字符串,则删除ppt。它似乎工作得很好,而代码似乎无缘无故停止循环。我必须按F5大约4次,代码才能在所有工作表中循环。这可能与我的代码有关,所以我想我应该先试试Stackoverflow的好人Powerpoint VBA循环未在所有幻灯片中循环,vba,loops,powerpoint,shapes,Vba,Loops,Powerpoint,Shapes,有一点问题,我有一些VBA代码,可以循环浏览ppt中的所有图纸,循环浏览每个ppt中的所有形状,如果找不到特定的文本字符串,则删除ppt。它似乎工作得很好,而代码似乎无缘无故停止循环。我必须按F5大约4次,代码才能在所有工作表中循环。这可能与我的代码有关,所以我想我应该先试试Stackoverflow的好人 Public Sub ExportMBR() Dim oSld As Slide Dim oShp As Shape Dim strSearch As String Dim i As Int
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
公共子导出MBR()
将oSld设置为幻灯片
将oShp调暗为形状
作为字符串的Dim stresearch
作为整数的Dim i
strSearch=“R&T MBR”
i=0
对于ActivePresentation.Slides中的每个oSld
Debug.Print(ActivePresentation.Slides.Count)
Debug.Print(oSld.Name)
对于oSld形状中的每个oShp
如果是oShp.HasTextFrame,则
如果oShp.TextFrame.TextRange.Find(strSearch)为空,则
其他的
Debug.Print(oSld.Name和“找到幻灯片”)
i=i+1
如果结束
如果结束
下一个oShp
如果i=0,那么
Debug.Print(oSld.Name和“删除”)
奥斯陆.删除
i=0
如果结束
i=0
下一个奥斯陆
myQ=“”
myName=myQ&“)&“.pptx”
ActivePresentation.SaveCopyAs myName
调用Shell(“explorer.exe”&myQ,vbNormalFocus)
端接头
在我的ppt中有34张幻灯片,每次运行将循环大约7张幻灯片,正确识别和删除我不需要的幻灯片,但没有任何错误,它将停止循环并继续执行其余代码。如果这有区别,可以在幻灯片17和18中找到该字符串。我已经添加了一些额外的位来尝试解决诸如debug.prints和I=0之类的问题,但我无法找出我做错了什么
非常感谢
ppw因为Find(strearch)
和oSld.Delete
在同一个循环中,您需要将它们分开!!
先处理要删除的幻灯片,然后删除它们
例如:假设您有幻灯片1、幻灯片2和幻灯片3,并且希望删除幻灯片1、幻灯片2和幻灯片3。实际上,您的VBA只删除幻灯片1和幻灯片3
在ActivePresentation.Slides中每个oSld的循环
中,查找顺序应该是slide_1=>slide_2=>slide_3。但是,第一个循环将删除幻灯片1,剩余的幻灯片计数变为2(幻灯片2和幻灯片3),因此第二个循环将从幻灯片3开始。这就是为什么。每当在循环遍历集合中的每个对象时删除集合中的任何对象时,都需要向后计数。因此,在这些情况下,您不能在ActivePresentation.Slides中使用For Each oSld语句,而是执行以下操作:
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
在Bah下载更多免费的PowerPoint宏和加载项,我有多蠢,我完全错过了那一个,谢谢你的详细回复!感谢@JamieG的解释和修复代码。