这个真让我烦恼!我尝试关闭可能在后台打开的所有演示文稿(可见或不可见),而没有执行宏的活动演示文稿。
这里的事情是,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
答案 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
因此,在从集合中删除对象时,我们从后向开始