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

时间:2014-06-12 13:40:04

标签: excel vba excel-vba undo

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

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

3 个答案:

答案 0 :(得分:8)

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

  1. MyMacro
  2. MyStateSavingMacro
  3. MyStateRevertingMacro
  4. E.g。我的宏更改活动工作表的范围 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
    

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

    编辑: 要在MyMacro运行之前保留撤消队列,优雅的解决方案是创建一个4-5 MyStateRevertingMacro_1,_ 2等链,您可以在其中应用来自Worksheet_Change日志系统的信息,然后链 - 每个版本中Application.OnUndoApplication.OnUndo,因此每个恢复宏的{{1}}都会引用之前的状态恢复代码。

答案 1 :(得分:3)

您可以使用隐藏的镜像表执行此操作。当然,如果您的工作表足够简单,它将起作用。您必须确定哪些单元格是可编辑的,并将它们复制到镜像表,这些单元格是不可编辑的,并将它们从镜像表复制。并且您的宏应该只在镜像表中工作。就是这样。

答案 2 :(得分:0)

这个现在有点旧了,但万一有人仍然试图让它工作 - 我只是尝试设置撤销堆栈,以便能够撤消宏重新格式化的列上的格式,并注意到这样做完全撤消命令工作(在我添加此位之前撤消不可用) - 无论自定义撤消代码包含什么(在我的情况下我还没有创建例程),应用程序撤消工作正常

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