Powerpoint VBA 撤销

4

我有一段处理PowerPoint文件中多个幻灯片的VBA代码。 代码的一部分会暂时调整幻灯片的大小,以便能够按不同的宽高比导出图像。

我不能将它们重新调整为原来的大小,因为PowerPoint永远无法将其内容恢复到调整前的完全状态,所以我执行了

Application.StartNewUndoEntry

我进行调整大小之前,然后......

Application.CommandBars.ExecuteMso "Undo"

在我导出之后,可以撤销调整大小并确保所有内容恢复到调整大小之前的状态。

然后,我会写一些元数据到幻灯片注释页,并为下一张幻灯片重复这个过程。

问题在于:

Application.CommandBars.ExecuteMso "Undo"

未阻塞直到撤销完成。这意味着在笔记页上的写入(在 Application.CommandBars.ExecuteMso "Undo"之后)也被撤消了!
我该如何让PowerPoint等待它完成Application.CommandBars.ExecuteMso "Undo"之后再执行写入笔记页的代码?
我尝试在撤消和其他代码之间等待并休眠,甚至长达几秒钟,但似乎这根本不起作用。它仍然会撤消调用executeMso "Undo"之后执行的代码
(我还考虑过存储我需要更新笔记页的幻灯片的ID,直到所有调整大小和导出都完成,然后去更新所有笔记页,但我怀疑这将是浪费时间,因为最后一个撤销没有完成其工作之前,第一个(或多个)仍将丢失。)
(我还尝试将笔记更新代码移到调整幻灯片大小(然后撤销)之前 - 但这行不通,因为它只是将问题移动到上一个幻灯片撤销未完成,而不是当前的问题。)

1
在您的撤销步骤之后放置 Application.StartNewUndoEntry。这样应该会强制解决它,然后继续而不影响其他步骤。否则,PowerPoint 将把单个宏所做的所有更改视为一个撤销步骤。 - Mike
1个回答

0
创建了一个解决方法,通过等待幻灯片大小返回到调整大小之前的状态来实现。
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

有时它会等待1或2次才能检测到撤销已经发生。 其他时候,它会等待多达40次迭代(4秒)。 有一次在100次迭代(10秒)后停止了。
嗯,虽然不太美观,但它确实有效!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接