Powerpoint VBA撤消

Powerpoint VBA撤消,vba,powerpoint,Vba,Powerpoint,我有VBA代码,可以处理PowerPoint文件中的许多幻灯片。 部分代码临时调整幻灯片的大小,以便我可以以不同的纵横比导出图像 我无法重新调整它们的大小,因为PowerPoint从未将它们的内容完全恢复到调整大小之前的状态,因此我执行了 Application.StartNewUndoEntry 在我调整大小之前,然后 Application.CommandBars.ExecuteMso "Undo" 导出后,我将撤消调整大小,并确保所有内容都完全恢复到调整大小之前的状态 然后,我将一些元

我有VBA代码,可以处理PowerPoint文件中的许多幻灯片。 部分代码临时调整幻灯片的大小,以便我可以以不同的纵横比导出图像

我无法重新调整它们的大小,因为PowerPoint从未将它们的内容完全恢复到调整大小之前的状态,因此我执行了

Application.StartNewUndoEntry
在我调整大小之前,然后

Application.CommandBars.ExecuteMso "Undo"
导出后,我将撤消调整大小,并确保所有内容都完全恢复到调整大小之前的状态

然后,我将一些元数据写入幻灯片备注页面,并在下一张幻灯片中重复

问题是

Application.CommandBars.ExecuteMso "Undo"
在撤消完成之前不会阻塞。这意味着对notes页面的写入(在随后的
Application.commandbar.ExecuteMso“Undo”
)也会被撤消

如何让PowerPoint在执行写入notes页面的代码之前等待它完成
Application.commandbar.ExecuteMso“Undo”

我试着在撤销和我的其他代码之间等待几秒钟,甚至睡眠几秒钟,但这似乎没有任何帮助。它仍然会撤消调用executeMso“Undo”后执行的代码

(我也曾想过存储我需要更新笔记页面的幻灯片ID,直到所有大小调整和导出完成,然后再更新所有笔记页面,但我怀疑这会浪费时间,因为第一个(或多个)仍然会丢失,因为最后一次撤消未完成其工作。)


(在调整幻灯片大小(然后撤消)之前,我也尝试将notes更新代码移至,但这不起作用,因为它只是将问题移至上一张幻灯片撤消未完成,而不是当前幻灯片。)

通过等待幻灯片大小恢复到调整大小之前的大小,创建了一个解决方案

i = 0
Do While ActivePresentation.PageSetup.SlideWidth <> dOldSlideWidth And i <= 100
    i = i + 1
    Sleep 100
    DoEvents
Loop
If i >= 100 Then MsgBox "Gave up after waiting 100 times for the slidewidth to revert after Undo"
oSi.sQHash = SlideInfoCreateQHASH(oSi)
SlideInfoWrite oSl, oSi
i=0
当ActivePresentation.PageSetup.SlideWidth dOldSlideWidth且i=100时执行此操作,然后MsgBox“在等待100次SlideWidth在撤消后恢复后放弃”
oSi.sQHash=slideInfo创建Qhash(oSi)
幻灯片信息写入oSl,oSi
有时,它会等待1到2次,然后才检测到撤消已发生。 其他时间,它最多等待40次迭代(4秒)。 一旦它在100次迭代(10秒)后停止其LEF


嗯,它不漂亮,但它的工作

在撤消步骤后放置
应用程序。启动newundentry
。这将迫使它解决问题,然后在不影响其他步骤的情况下继续下去。否则,Powerpoint会将单个宏中的所有更改视为一个撤消步骤。