PowerPoint 2016 Presentation.Close不会从Application.Presentations中删除条目

时间:2017-11-22 15:03:17

标签: vba powerpoint powerpoint-vba

设置

  • PowerPoint 2016
  • .NET com-addin(CP 4)with
    • WindowActivate DISPID(2009)
    • 为了测试目的而改变为只做了必需品"
  • Windows 10
  • 使用Windows资源管理器在文件夹中创建一个空文件(没有幻灯片 在文件里面。)

问题描述

使用集成的VBA我运行此代码三次

Option Explicit    
Sub test()
    Dim objPresentation As PowerPoint.Presentation
    Set objPresentation = Application.Presentations.Open("c:\test\folder\file.pptx")
    objPresentation.Close
    Set objPresentation = Nothing
    Debug.Print Presentations.Count
    For Each objPresentation In Presentations
        Debug.Print objPresentation.FullName, vbTab, objPresentation.Windows.Count
    Next
End Sub

请在下面找到结果

 2 
C:\Users\admin\Desktop\kh_tests.pptm                     1 
c:\test\folder\file.pptx                   0 
 3 
C:\Users\admin\Desktop\kh_tests.pptm                     1 
c:\test\folder\file.pptx                   0 
c:\test\folder\file.pptx                   0 
 4 
C:\Users\admin\Desktop\kh_tests.pptm                     1 
c:\test\folder\file.pptx                   0 
c:\test\folder\file.pptx                   0 
c:\test\folder\file.pptx                   0 

它不仅混淆了我的插件(是否是演示文稿打开),它似乎不是故意的,因为人们可能期望ppt至少重用上次留下的条目,但是进入似乎是腐败的。

我在使用PPT2016的多个系统上遇到过这种行为。

PPT2010 显示此行为。 谢谢你的阅读 KH

解释/假说

认为我更接近原因(抱歉花了很长时间但你知道它有多久);我开始相信"某人"仍然指向那个特定的演示文稿,所以它可能不会关闭;所以我决定再去一次。

我通过选择性地禁用我的com-addin中的所有内容来缩小它,但没有结果:即使没有(只是"返回")行为保持不变;但如果我没有连接我的连接点( WindowActivate ,DISPID 2009),它首先突然工作,一切顺利。根据我的日志文件,事件一直在关闭后处理,不会干扰任何事情,但谁知道。我试图强制使用DoEvents,但无济于事。

假设: WindowActivate事件接收器的存在将使PowerPoint2016不会丢弃当时当前处于活动状态的演示文稿,即使关闭演示文稿是该事件的首要原因

测试: 不幸的是,我发现没有简单的方法来进行vba / inapp测试。有什么想法吗?

但是我的完全成熟的com插件存在(好吧,仍然很多停用,通过接收器连接),我测试了这个:

Option Explicit

Dim objCloak As PowerPoint.Presentation

Sub test()
    Dim objPresentation As PowerPoint.Presentation
    Set objPresentation = Application.Presentations.Open("C:\test\folder\file.pptx")

    If objCloak Is Nothing Then
        Set objCloak = Presentations.Add ' change to the intermediate presentation
    End If

    DoEvents                         ' relic from previous tests
    objCloak.Windows(1).Activate '   ' be paranoid

    DoEvents                         ' relic from previous tests
    objPresentation.Close
    DoEvents                         ' relic from previous tests

    If (Not (Nothing Is objCloak)) Then
        objCloak.Saved = True
        objCloak.Close
    End If
    Set objCloak = Nothing

    For Each objPresentation In Presentations
        Debug.Print objPresentation.FullName, vbTab, objPresentation.Windows.Count
    Next

End Sub

结果是

C:\Users\admin\Desktop\kh_tests.pptm                     1 
C:\Users\admin\Desktop\kh_tests.pptm                     1 
C:\Users\admin\Desktop\kh_tests.pptm                     1 

在两个变体之间切换回来并强制产生如上所述的结果。所以我认为这里有一些东西。

注意:PowerPoint任务现在关闭没有任何问题。

0 个答案:

没有答案