【问题标题】:Building Undo Into an Excel VBA Macro将撤消构建到 Excel VBA 宏中
【发布时间】:2010-09-25 06:01:11
【问题描述】:

Excel 宏在运行后似乎不允许使用“撤消”。有没有办法将undo 功能烘焙到 Excel 中的 VBA 宏中?

【问题讨论】:

    标签: vba excel undo


    【解决方案1】:

    我总是在运行宏之前立即保存(至少在测试期间)然后,如果一切都变成梨形,我可以直接退出而不保存并重新打开它。

    将其烘焙到实际的宏中,您必须基本上将所有更改的旧状态(单元格内容、公式、格式等)记录在一个列表中,然后有一个撤消宏来反向播放该列表顺序。

    例如,如果您的宏将单元格 C22 的内容从“3”更改为“7”,并将格式从“常规”更改为“数字,2 位小数),您的列表将是:

    C22 value  3
    C22 format general
    

    以相反的顺序播放(使用另一个宏)将还原更改。

    您可以有一个完整的额外工作表来保存宏撤消信息,例如:

    Step   Cell   Type    Value
    ----   ----   -----   -------
       1   C22    value         3
           C22    format  general
       2...
    

    不幸的是,它不能很好地与“真正的”撤消集成,但我认为没有任何办法。

    【讨论】:

      【解决方案2】:

      Excel VBA 有 Application.OnUndo 函数来处理这个问题:

      Public Sub DoSomething
      
          ... do stuff here
      
          Application.OnUndo "Undo something", "UnDoSomething"
      End Sub
      
      Public Sub UnDoSomething
      
          ... reverse the action here
      
      End Sub

      【讨论】:

      • 虽然这将有助于撤消第一个 sub 的操作,但不幸的是,您仍然会丢失在运行 sub 之前可能已经可用的撤消操作的“历史记录”。如果有人知道如何解决这个问题,那将是一个真正的福音。
      • @ExcelDevelopers 你的意思是here
      • @Reafidy,并不是因为该解决方案仅保留 VBA 所做更改的撤消历史记录,而不是用户所做的更改。
      • 可以使用 ctrl-z 撤消用户所做的更改。
      • @Reafidy:不是在 VBA 代码对工作簿状态进行了自己的更改之后。
      【解决方案3】:

      我的想法很简单,因为宏中的第一行将副本保存在备份目录中,然后关闭该工作簿并重新打开原始文件。如果您不喜欢宏运行的结果,请调出保存的工作簿。保持简单吧?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-21
        • 2011-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多