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

我想知道是否有一种方法来保存macros运行后撤消操作的能力。 我不关心macros的结果 – 只需要撤消用户在macros之前完成的操作。

背景:在worksheet_change事件上有一个macroslogging谁在这个工作表上进行更改。 我不希望它限制用户撤消他/她的行为的能力。

有没有简单的方法来做到这一点,但这是可能的。 对此的方法是创build三个macros,并使用一些全局variables来保存状态:

  1. MyMacro
  2. MyStateSavingMacro
  3. MyStateRevertingMacro

例如,我的macros更改活动工作表的范围A1:A10中的单元格。 所以,每当运行我的macros的代码被调用,它就会执行

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 

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

编辑:为了在MyMacro运行之前保留撤消队列,不雅的解决scheme是创build一个4-5 MyStateRevertingMacro_1 ,_2等的链,在这里你可以应用Worksheet_Change日志系统中的信息,然后链接Application.OnUndo中的每一个,所以这些Reverting Macros中的每一个的Application.OnUndo都会引用先前的状态返回码。

你可以使用隐藏的镜子来做到这一点。 当然,如果你的工作表很简单,它就会工作。 您必须确定哪些单元格是可编辑的,并将它们复制到镜像表单中,这些表单是不可编辑的,并从镜像表单复制它们。 而你的macros应该只在镜像表中工作。 而已。

这个现在有点老了,但是如果有人仍然试图让这个工作 – 我只是试图设置撤消堆栈可以撤消一个macros的格式化已经重新格式化,并注意到通过这样做完全撤消命令工作(在我添加了这个位之前,撤销是不可用的) – 不pipe什么自定义撤消代码包含(在我的情况下,我甚至还没有创build例程),应用程序撤消完美

Application.OnUndo "Undo Amount Format", "sUndo_Col2"