使VBA代码一步撤消

时间:2015-02-06 05:54:46

标签: vba word-vba

有没有办法让Word 2013宏的VBA代码作为块执行,所以如果我撤消它,它不会通过它执行的各个步骤撤消宏?我希望宏更像内置函数。

我有一个宏,它将光标移动到一个单词的末尾,然后删除前三个字母。如果我撤消它,我会看到这三个字母中的每一个都会逐一出现。

我可能没有说明这一点。我想知道是否有代码来包装一个宏来让Word处理宏像一个内置的工作命令执行所有一次而不是执行一系列记录的步骤。然后,如果我运行一个宏并决定我不喜欢结果,我可以点击撤销,整个宏都会回撤和撤消。

2 个答案:

答案 0 :(得分:5)

使用Application.UndoRecord,如下所示:

方法一:

Sub YourMacroName
    Dim objUndo As UndoRecord 
    'Declares the variable objUndo of the UndoRecord type
    Set objUndo = Application.UndoRecord 
    'sets the object to an actual item on the undo stack
    objUndo.StartCustomRecord ("Undo Stack Display Text")
    'Tells Word where to begin "recording" the undo record
    'This item also lets you set the text you want to appear in the undo drop-down in word.

        Selection.MoveRight Unit:=wdWord 
        'Moves to the end of the current word
        Selection.MoveLeft Unit:=wdCharacter, Count:=3, Extend:=True 
        'Selects the last three letters of the word
        Selection.Delete
        'Deletes the last three letters of the word
    objUndo.EndCustomRecord
    'Denotes the End of The Undo Record
End Sub

您可能还想查看Microsoft关于使用Application.UndoRecord Property

的文章

或者,正如@Matteo NNZ提到的那样,您可以一次删除这三个字符。为此,请使用以下代码。

方法二:

Sub YourMacroName
     Selection.MoveRight Unit:=wdWord 
    'Moves to the end of the current word
    Selection.MoveLeft Unit:=wdCharacter, Count:=3, Extend:=True 
    'Selects the last three letters of the word
    Selection.Delete
    'Deletes the last three letters of the word
End Sub

第二种方法的缺点是您无法在撤消下拉列表中控制项目的名称。

这两种方法都受到限制,因为它们不会将光标恢复到原始位置。

答案 1 :(得分:0)

感谢JRP对解决此问题有很大帮助:

这两种方法的局限性在于它们不能将光标恢复到其原始位置。

录制UndoRecord后,请在当前选择Selection.InsertAfter (" ")的末尾添加一个空格,然后再次将其删除。

我使用的近似块是:

Dim originalSelection As Range

Application.UndoRecord.StartCustomRecord ("Delete previous")

Set originalSelection = Selection.Range
Selection.InsertAfter (" ")
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.TypeBackspace
originalSelection.Select

... your code here ...

Application.UndoRecord.EndCustomRecord