我想知道是否有一种方法可以在宏运行后保存撤消操作的能力。 我不关心宏的结果 - 只需撤消用户在宏之前完成的操作。
背景: 我在 worksheet_change 事件上有一个宏,用于记录谁以及何时对此工作表进行了更改。我不希望它限制用户撤消其操作的能力。
最佳答案
没有简单的方法可以做到这一点,但这是可能的。解决方法是创建三个宏,并使用一些全局变量来保存状态:
- 我的宏
- MyStateSavingMacro
- 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
所以就这样了。这并不漂亮,但可以做到。 引用: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
将引用之前的状态恢复代码。
关于vba - 在宏运行期间保存撤消堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24185942/