提问人:KurtisT 提问时间:3/20/2023 最后编辑:KurtisT 更新时间:3/20/2023 访问量:45
PowerPoint VBA挂起打开损坏的文件
PowerPoint VBA Hangs Opening Corrupt File
问:
我在 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
我可能应该提到,在“设置”中,我将错误捕获设置为“在未处理的错误上中断”(而不是在所有错误上)。
有什么建议吗?
答:
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
评论