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

我想知道是否有一种方法可以在宏运行后保存撤消操作的功能。
我不关心宏的结果-只需要撤消用户在宏之前执行的操作

背景:
我在工作表_change事件上有一个宏,记录谁以及何时在此工作表上进行了更改。我不希望它限制用户撤消其操作的能力

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

  1. MyMacro
  2. MyStateSavingMacro
  3. MyStateRevertingMacro

例如,我的宏更改活动工作表范围A1:A10中的单元格。因此,无论何时调用运行宏的代码,它都会执行

子MyMacro()
调用MyStateSavingMacro()
'将A1:A10范围内的内容和公式复制到全局数据对象
'... 这里是MyMacro的代码
'
'................
调用Application.OnUndo(“撤消MyMacro”、“MyStateRevertingMacro”)
'这将MyStateRevertingMacro()放入撤消队列
'所以按ctrl-Z键将调用该过程中的代码
端接头
子MyStateSavingMacro()
'将您可能更改的任何内容复制到全局数据结构的代码
端接头
子MyStateRevertingMacro
'将存储在全局变量中的原始状态复制到电子表格的代码
端接头

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

编辑:
为了在运行MyMacro之前保留撤消队列,不雅观的解决方案是创建一个由4-5个MyStateRevertingMacro\u 1,\u 2等组成的链。在这些链中,您可以应用工作表\u更改日志记录系统中的信息,然后将应用程序.OnUndo链接到其中的每一个,因此,Application.OnUndo对于这些还原宏中的每一个都会引用以前的状态还原代码

发表评论