[英]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(slide_2和slide_3),因此第二個循環周期將從slide_3開始。 這就是原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.