没有简单的方法可以做到这一点,但这是可能的.解决方法是创建三个宏,并使用一些全局变量来保存状态:
例如,我的宏更改了活动工作表的范围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
对于每个恢复宏将参考以前的状态恢复代码.