在宏运行期间保存撤消堆栈

Edu*_*993 10 excel vba undo excel-vba

我想知道是否有办法在宏运行后保存撤消操作的能力.我不关心宏的结果 - 只需要撤消用户在宏之前完成的操作.

背景:我在worksheet_change事件上有一个宏,用于记录在此工作表上进行更改的人员和时间.我不希望它限制用户撤消他/她的行为的能力.

hnk*_*hnk 8

没有简单的方法可以做到这一点,但这是可能的.解决方法是创建三个宏,并使用一些全局变量来保存状态:

  1. MyMacro
  2. MyStateSavingMacro
  3. MyStateRevertingMacro

例如,我的宏更改了活动工作表的范围A1:A10中的单元格.因此,每当调用运行我的宏的代码时,它就会执行

Sub MyMacro()       
    Call MyStateSavingMacro() 
    ' Copies contents and formulae in range A1:A10 to a global data object

    '... Code for MyMacro goes here
    '
    '................

    Call Application.OnUndo("Undo MyMacro", "MyStateRevertingMacro")
    'This puts MyStateRevertingMacro() in the Undo queue
    'So pressing ctrl-Z invokes code in that procedure
End Sub


Sub MyStateSavingMacro()
    ' Code to copy into global data structures anything you might change
End Sub

Sub MyStateRevertingMacro
    ' Code to copy onto the spreadsheet the original state stored in the global variables
End Sub
Run Code Online (Sandbox Code Playgroud)

就是这样.它不漂亮,但可以做到.参考:http://msdn.microsoft.com/en-us/library/office/ff194135%28v=office.15%29.aspx

编辑:要在运行MyMacro之前保留撤消队列,优雅的解决方案是创建一个4-5 MyStateRevertingMacro_1,_2等链,您可以在其中应用来自Worksheet_Change日志记录系统的信息,然后将其链接起来Application.OnUndo.每一个,所以Application.OnUndo对于每个恢复宏将参考以前的状态恢复代码.