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

标签 vba excel undo

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

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

最佳答案

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

  1. 我的宏
  2. MyStateSavingMacro
  3. 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/

相关文章:

vba - 从格式为 (A1 :A15)

Excel VLOOKUP 在表数组中具有多个可能的选项

php - 恢复sql语句的函数

vba - Excel VBA 类型不匹配 (13)

xml - 将 XML 文档中的数据解析为 Excel 工作表

excel - XLL 可以从单单元格公式返回任意大小的数组吗?

IOS/ Storyboard : Images Disappear from identity inspector after lengthy Redos but still visible in Storyboard

javascript - jQuery - 如何创建可撤消的操作?

vba - 将代码从 VBA 运行到 VBScript 再返回到 VBA

.net - 从 VBA 调用 COM 加载项选项