知识库 KB0209

无法使用 PowerPoint 2013 和 2016 修复 PowerPoint 文件

问题

PowerPoint 无法修复损坏的 PowerPoint 文件。

说明

若在 PowerPoint 修复文件之前以编程方式访问幻灯片,则修复 PowerPoint 文件将失败。但是,打开文件时,think-cell(很有可能还有其他加载项)必须访问幻灯片,加载项无法得知文件已损坏。

我们已经向 Microsoft 报告,但是 Microsoft 迄今为止尚未决定要修复该问题。若贵公司有 Microsoft Office 支持合同,而且您希望联系 Microsoft 请求修复,可以参阅 Microsoft 案例编号 115040112590053。该错误在不使用 think-cell 的情况下也会重现。

在不使用 think-cell 的情况下重现

若有代码在修复完成之前访问损坏的幻灯片,则在不使用 think-cell 的情况下也可以重现该错误。在以下的重现过程中,事件处理程序 PresentationOpen 会调用代码在文件打开时(即修复之前)访问所有幻灯片。

  1. 启动 PowerPoint 2013 或 2016 打开新的空文件。
  2. 在 PowerPoint 中,转到 Insert > think-cell > Tools 工具菜单图标. > Deactivate think-cell
  3. Alt + F11 打开 Microsoft Visual Basic for Applications
  4. 添加此代码作为类模块,并将其命名为 cEventClass

    Public WithEvents PPTEvent As Application
    
    Private Sub Class_Initialize()
        MsgBox "EventHandler is now active."
    End Sub
    
    Private Sub PPTEvent_PresentationOpen(ByVal pres As Presentation)
        On Error GoTo errHandle:
        
        Debug.Print "open file: " & pres.Name
        Dim i As Integer
        
        For i = 1 To pres.Slides.Count
            Debug.Print "Slide " & pres.Slides.Item(i).SlideNumber; " / " _ 
    	& pres.Slides.Count
        Next i
        
        Exit Sub
        
    errHandle:
        Debug.Print ("VBA Error: " & Err.Number & " " & Err.Description) & vbCr
    End Sub

  5. 添加以下代码作为模块

    Dim cPPTObject As New cEventClass
    
    Sub Initialize_Eventhandler()
        Set cPPTObject.PPTEvent = Application
        Debug.Print "**** EventHandler active ****"
    End Sub

  6. 在 PowerPoint 演示文稿窗口中,按 Alt + F8 打开窗口
  7. 运行 Initialize_Eventhandler 宏。
  8. 现在,打开损坏的 PowerPoint 文件,然后尝试对其进行修复。

使用 Microsoft Office 2010 不会发生此问题。

解决方案

在 Microsoft 修复此 Bug 之前,您可以采用临时停用 think-cell 的解决方法:

  1. 在 PowerPoint 中停用 think-cell:Insert > think-cell > Tools 工具菜单图标. > Deactivate think-cell
  2. 打开损坏的文件并进行修复
  3. 在 PowerPoint 中重新激活 think-cell:插入think-cell激活

分享