我目前编写了一个Excel VBA代码,可以创建40 + PowerPoint幻灯片。但是,在运行此代码时,PowerPoint 在创建 22 张幻灯片后崩溃。仅当一次性运行 VBA 代码时,才会发生此问题。因为,当我尝试逐行运行相同的代码时,它会成功运行到最后。
对我来说,这很奇怪。我们对这个问题有什么建议吗?
=>下面列出了创建幻灯片 2 之前我的代码(此后它一个接一个地创建其他幻灯片,直到第 43 张幻灯片(
问候阿洛克
Sub test25()
Dim pApp As PowerPoint.Application
Dim pPres As PowerPoint.Presentation
Dim pSlid As PowerPoint.Slide
Set pApp = New PowerPoint.Application
pApp.Visible = True
pApp.Activate
Set pPres = pApp.Presentations.Open("C:.....Template.pptx")
pPres.Slides(1).Select
Sheets("S01").Select
ActiveSheet.Range("A1:P27").Select
ActiveSheet.Shapes.SelectAll
Selection.copy
pPres.Slides(1).Shapes.PasteSpecial DataType:=wdPasteText
pPres.Slides(2).Duplicate
pPres.Slides(2).Select
Sheets("S02").Select
ActiveSheet.Range("A1:P27").Select
ActiveSheet.Shapes.SelectAll
Selection.copy
pPres.Slides(2).Shapes.PasteSpecial DataType:=wdPasteText
End Sub
我看到了多个潜在问题,其中一些只是代码改进。
在线上:
pPres.Slides(2).Duplicate
您指的是幻灯片 2,但尚未创建幻灯片 2(因为这是创建它的行(。 将其更改为:
pPres.Slides(1).Duplicate
没有那个,我看不到您的代码是如何运行的,即使是一行一行......除非"模板.pptx"已经拥有所有幻灯片(在这种情况下,为什么要复制? 我假设"模板.pptx只包含第一张幻灯片(
最初我怀疑是竞争条件,但通常 VBA 可以很好地处理这些条件。 可以肯定的是,只是一般的良好做法,您可能希望使用变量来引用当前幻灯片,而不仅仅是一个数字(您已经声明了变量(
Set pSlid = pPres.Slides(1)
Sheets("S01").Select
ActiveSheet.Range("A1:P27").Select
ActiveSheet.Shapes.SelectAll
Selection.copy
pSlid.Shapes.PasteSpecial DataType:=wdPasteText
Set pSlid = pSlid.Duplicate
...
同样为了您自己的方便,您希望研究使用循环,例如:
Set pSlid = pPres.Slides(1)
For i = 1 to 43
Sheets("S" & Format(CStr(i), "00")).Select
ActiveSheet.Range("A1:P27").Select
ActiveSheet.Shapes.SelectAll
Selection.copy
pSlid.Shapes.PasteSpecial DataType:=wdPasteText
Set pSlid = pSlid.Duplicate
Next