簡體   English   中英

Powerpoint VBA Loop不在所有幻燈片中循環播放

[英]Powerpoint VBA Loop not looping through all slides

有點問題,我有一些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

我的ppt中有34張幻燈片,每次運行將正確地循環瀏覽約7張幻燈片,以識別並刪除我不需要的幻燈片,但是如果沒有任何錯誤,它將停止循環並繼續執行其余代碼。 如果有區別,可以在幻燈片17和18上找到該字符串。 我添加了一些額外的內容來嘗試解決debug.prints和i = 0之類的問題,但我只是無法弄清楚自己在做什么錯。

提前謝謝了!

w

每當遍歷該集合中的每個對象時刪除該集合中的任何對象時,都需要向后計數。 因此,在這些情況下,您不能使用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

http://youpresent.co.uk下載更多免費的PowerPoint宏和加載項。

因為Find(strSearch)oSld.Delete處於同一循環,所以您需要將它們分開! 先處理要刪除的幻燈片,然后再刪除它們。

例如:假設您有slide_1和slide_2和slide_3,並且要刪除slide_1和slide_2和slide_3。 實際上,您的VBA僅刪除slide_1和slide_3。

For Each oSld In ActivePresentation.Slides循環中,查找順序應為slide_1 => slide_2 => slide_3。 但是,第一個循環周期將刪除slide_1,其余的幻燈片數將變為2(sli​​de_2和slide_3),因此第二個循環周期將從slide_3開始。 這就是原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM