PowerPoint VBA挂起打开损坏的文件

PowerPoint VBA Hangs Opening Corrupt File

提问人:KurtisT 提问时间:3/20/2023 最后编辑:KurtisT 更新时间:3/20/2023 访问量:45

问:

我在 PowerPoint VBA 中编写了一个例程,用于搜索所选文件夹及其子文件夹中的所有 pptx 文件,以计算使用每个 CustomLayout 的幻灯片数量。它实际上可以正常工作,除非它找到一个 pptx,如果我正常打开它,它会发出警报:“PowerPoint 发现(文件名)中的内容有问题。如果您信任此演示文稿的来源,请单击“修复”。修理还是取消?我不知道为什么我的硬盘上有这么多文件有这个问题(到目前为止,100 个文件中大约有 5 个)。但真正的问题是:我的 VBA 不应该跳过有错误的文件,而不是给出“运行时错误'-2147467259 (800004005)':对象'Presentations'的方法'打开'失败”吗?

我一直在使用 Debug.Print 并将结果打印到文件中,所以总的来说它工作正常,直到它到达一个坏文件。起初,我担心我的代码可能会导致损坏,所以我尝试手动打开文件,直到我的代码到达之前出现错误。我也已经在谷歌上搜索了几个小时,你会在下面的代码中看到,我尝试了几种方法来跳过这个错误,没有喜悦。

这是错误消息带我去的“Set ppt =”。在此之前还有很多代码,但这是麻烦的部分。

For Each varFilename In colFiles
    i = i + 1
    On Error GoTo ErrorOpeningPresentation
    Set ppt = Presentations.Open(varFilename, ReadOnly:=msoTrue, Untitled:=msoTrue, WithWindow:=msoFalse)
    If Err.Number <> 0 Then GoTo ErrorOpeningPresentation
    If Not ppt Is Nothing Then 'See if this skips files that PP can't read
        Debug.Print "File " & i & " of " & colFiles.Count & ", " & ppt.Slides.Count & " slides in " & varFilename
        For Each sld In ppt.Slides
            Print #1, i & "; " & varFilename & "; Slide " & sld.SlideIndex & "; Layout " & sld.CustomLayout.Index & "; " & sld.CustomLayout.Name
        Next sld
        Presentations.Item(2).Close
        Set ppt = Nothing
        'Every 10 files pause 5 seconds to see if this helps to stop it from hanging
        If i Mod 10 = 0 Then
            tStart = Timer: While Timer < tStart + 5: DoEvents: Wend
        End If
    End If
ErrorOpeningPresentation:
    On Error GoTo 0

Next varFilename

即使是以下 4 行宏也会产生相同的问题:

Sub TestOpeningABadFile()
Dim ppt As Presentation
Set ppt = Presentations.Open("CorruptFile.pptx")
End Sub

我可能应该提到,在“设置”中,我将错误捕获设置为“在未处理的错误上中断”(而不是在所有错误上)。

有什么建议吗?

VBA 错误处理 PowerPoint

评论


答:

2赞 pgSystemTester 3/20/2023 #1

假设你只想不停地继续前进,我想你可能会这样做......唯一的缺点是,如果还有其他与打开文件相关的内容,它只会跳过它,尽管它会记录在您的调试窗口中。

For Each varFilename In colFiles
    i = i + 1
  
    On Error Resume Next 'continues on without stopping
    Set ppt = Presentations.Open(varFilename, ReadOnly:=msoTrue, Untitled:=msoTrue, WithWindow:=msoFalse)
    On Error GoTo 0 'prevents further error skipping
    
    
    If Not ppt Is Nothing Then 'See if this skips files that PP can't read
        Debug.Print "File " & i & " of " & colFiles.Count & ", " & ppt.Slides.Count & " slides in " & varFilename
        For Each sld In ppt.Slides
            Print #1, i & "; " & varFilename & "; Slide " & sld.SlideIndex & "; Layout " & sld.CustomLayout.Index & "; " & sld.CustomLayout.Name
        Next sld
        Presentations.Item(2).Close
        Set ppt = Nothing
        'Every 10 files pause 5 seconds to see if this helps to stop it from hanging
        If i Mod 10 = 0 Then
            tStart = Timer: While Timer < tStart + 5: DoEvents: Wend
        End If
        'ensures blank variable on next loop
        Set ppt = Nothing
            
    Else
        Debug.Print "Issue With " & varFilename 'log the issue
        
    End If

Next varFilename

评论

1赞 KurtisT 3/20/2023
匪夷所思!非常感谢,pgSystemTester。做到了。它只是循环浏览 360 个文件中的 4,400 张幻灯片,并无缝地标记了有问题的 4 个文件。出于我的目的,可以跳过这些。
1赞 pgSystemTester 3/21/2023
@KurtisT感谢您的接受。您可以考虑利用而不是暂停五秒钟。Do Events