在没有ActivePresentation的情况下关闭所有后台演示文稿

时间:2013-12-20 11:53:59

标签: vba powerpoint powerpoint-vba

这个真让我烦恼!我尝试关闭可能在后台打开的所有演示文稿(可见或不可见),而没有执行宏的活动演示文稿。

这里的事情是,For Each循环不会遍历所有文件,即使它可以这样做:

Dim i As Integer
Dim pres As PowerPoint.presentation
' Closes most of the presentations BUT NOT ALL of them
For Each pres In PowerPoint.Application.Presentations
    If pres.name <> PowerPoint.ActivePresentation.name Then
        pres.Close
        Set pres = Nothing
    End If
Next

之后并非所有演示文稿都已关闭。还有一些还在开!我可以看到Close被调用,但有些演示文稿仍然打开。

所以 - 知道这不是一个好的解决方案 - 我试图再次遍历所有的演示文稿。这次使用PowerPoint.Application.Presentations.Count属性。但它只是遇到了

For i = 1 To PowerPoint.Application.Presentations.Count
    Dim name As String
    Set pres = PowerPoint.Application.Presentations(i)
    If pres.name <> PowerPoint.ActivePresentation.name Then
        pres.Close
        Set pres = Nothing
    End If
Next

我不知道我在这个问题上做错了什么。


是一个选项! :d

While PowerPoint.Application.Presentations.Count > 1
    For Each pres In PowerPoint.Application.Presentations
        If pres.name <> PowerPoint.ActivePresentation.name Then
            pres.Saved = 1
            pres.Close
            Set pres = Nothing
        End If
    Next
Wend

2 个答案:

答案 0 :(得分:3)

为了从集合中正确删除对象(Presentations是),您需要向后移动。如果没有,该项目将从集合中删除,每个“后面”项目都会向前移动 - 但随后您增加了计数器,因此跳过一个!

因此,试试这个:

For i = Presentations.Count To 1 Step -1
    If Presentations(i).Name <> _
        ActivePresentation.Name Then
        Presentations(i).Close
    End If
Next

答案 1 :(得分:0)

Sub CloseAllOtherPresentation()
 Dim ChooseButton As VbMsgBoxResult
 ChooseButton = MsgBox("WARNING!! All opened presentation will    close,Continue?", vbYesNo, "")
 If ChooseButton = vbYes Then
        Dim i As Integer
          For i = Presentations.Count To 1 Step -1
             If Presentations(i).Name <> ActivePresentation.Name Then
                Presentations(i).Save
                Presentations(i).Close
              End If
          Next
   End If

End Sub

从集合中删除项目时,集合的索引会更新 例如。 A = 1,B = 2,C = 3,D = 4 E = 5 F = 6 [A-F是对象,数字是索引]。 对于迭代函数,计数器增加让我们说CT代表计数器。 当使用LOOP以向前方式移除对象时:)

CT = 1,A被删除,现在安排

B=1, C=2, D=3 E=4 F=5

CT = 2,C将被删除,因为现在是第二项,因此我们有

 B=1, D=2 E=3 F=4

CT = 3 ?,依此类推。最后,而不是删除所有它离开

 B=1,D=2,F=3

因此,在从集合中删除对象时,我们从后向开始