【问题标题】:Ending undo transaction in macro in PowerPoint在 PowerPoint 中的宏中结束撤消事务
【发布时间】:2012-01-04 00:34:10
【问题描述】:

http://support.microsoft.com/kb/278591 中所述,PowerPoint 通常会将宏或加载项所做的所有更改合并到单个撤消步骤中。因此,如果您将以下代码放入 VBA 并在此处按 F5 执行两次 只会是一个撤消步骤。

Sub Move()
    If ActiveWindow.Selection.Type = ppSelectionShapes Then
        ActiveWindow.Selection.ShapeRange.IncrementLeft 10
    End If
End Sub

我正在寻找一种方法来在更复杂的情况下更改此行为,在这种情况下,用户无需直接访问 PowerPoint 即可进行多项更改。理想情况下,从用户的角度来看,应该可以撤消与一个更改相对应的一组修改。

我发现 ExecuteMso 似乎破坏了撤消事务。因此,如果您执行以下代码两次,则会导致 4 个撤消步骤(第一个增量,ExecuteMso,第二个增量,ExecuteMso)。

Sub Move()
    If ActiveWindow.Selection.Type = ppSelectionShapes Then
        ActiveWindow.Selection.ShapeRange.IncrementLeft 10
        Application.CommandBars.ExecuteMso "Bold"
    End If
End Sub

有人知道问题的真正解决方案或更好的解决方法吗?虽然我没找到,也许有可以移植到 PowerPoint 的 Word 或 Excel 的解决方案?

【问题讨论】:

    标签: vba ms-office powerpoint undo


    【解决方案1】:

    如果您将ExecuteMso 行替换为这一行,则整个过程仍然是一个撤消:

    ActiveWindow.Selection.ShapeRange.TextEffect.FontBold = msoTrue
    

    更新

    如果您使用的是 PowerPoint 2010 或更高版本,请将此行放在您希望用户能够一次撤消一个步骤的每个代码块之前:

    Application.StartNewUndoEntry
    

    【讨论】:

    • 我想我在原帖中并没有完全说清楚:我希望该过程的每次执行对应于一个撤消步骤。您的建议将导致多次执行的单个步骤。 ExecuteMso 解决方法是我最接近所需行为的方法,这就是我提到它的原因。
    • 希望您使用的是 PowerPoint 2010,因为有一个新命令可以解决问题:Application.StartNewUndoEntry。将其放在要撤消的每一行代码之前。
    • 太棒了,这正是我想要的!通常我们使用 PowerPoint 2010,所以我会使用您推荐的功能。为了安全起见,除非您有其他建议,否则我将在 PowerPoint 2007 中包含 ExecuteMso 解决方法。
    • @RachelHettinger 如果我没看错,你的答案被接受是因为你的评论......你可能想相应地更新答案(我最初想知道为什么在我阅读 cmets 之前你的答案被接受)
    • 是否有与 Excel 的 Application.StartNewUndoEntry 等效的方法?在为 Excel 搜索类似的子时,我真的找不到任何东西。看来您需要在 Excel 中手动创建此类“还原点”?
    猜你喜欢
    • 1970-01-01
    • 2020-06-21
    • 2013-10-24
    • 2010-10-01
    • 2012-02-24
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多