Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powerpoint VBA循环未在所有幻灯片中循环_Vba_Loops_Powerpoint_Shapes - Fatal编程技术网

Powerpoint VBA循环未在所有幻灯片中循环

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

有一点问题,我有一些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 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的解释和修复代码。