【问题标题】:"Undo" Button in VBA that restores an entire version of a WorksheetVBA 中的“撤消”按钮可恢复整个工作表版本
【发布时间】:2016-08-18 22:30:39
【问题描述】:

我目前有一个启用宏的电子表格,它执行各种功能,包括更新、创建和删除数百行。如果出于某种原因,其中一个函数出现故障并删除了本应保留的信息 - 我想实现一个“撤消”按钮,以恢复刚刚被宏更改的电子表格版本。

我认为它会如下所示:

    Public InstanceOfWorksheet As Range

Sub Button_Click()
    InstanceOfWorksheet = CurrentWorksheet.UsedRange 'Or something like this
    'Macro functionality here
    CurrentWorksheet.Update() 'Worksheet has now been updated
    End Sub

Sub Button2_Click()
    InstanceOfWorksheet = CurrentWorksheet.UsedRange 'Or something like this
    'Second Macro functionality here
    CurrentWorksheet.Update() 'Worksheet has now been updated
    End Sub

Sub UndoLastMacro_Click()
    CurrentWorksheet = InstanceOfWorksheet
    End Sub

因此,在这种情况下,当您激活 UndoLastMacro 命令时,您将有效地“恢复”上次调用宏之前的工作表版本。

我的问题是,InstanceOfWorksheet 应该是什么变量类型,以及将InstanceOfWorksheet 的内容复制回当前工作表的最简单方法是什么?

提前致谢! :)

【问题讨论】:

  • 您需要多个变量,一个范围变量和一个数据类型为Variant 的数组变量来保存目标范围的值。这假设您的更改仅与值有关。如果公式、格式等也改变了,那就复杂得多了。
  • 再想一想,一个更简单、更安全的方法是制作工作表的临时副本,如果在进行更改时没有出现错误,则将其删除。使用On error resume next,如果最后是Err.Number = 0,则删除临时副本。
  • 您最好创建一个新工作表来存储.UsedRange.Formula。除非记录每个更改,否则 VBA 很难撤消。或者,只需将工作簿的副本保存到 Temp 文件夹?

标签: vba excel macros worksheet-function


【解决方案1】:

我会在代码中做这样的事情

Sub Button_Click()
    Dim TemporaryFileName as String
    TemporaryFileName = "FileName" 'You can include a path here too like "C:\Wherever\FileName"
    ThisWorkbook.SaveAs(TemporaryFileName)
    ... (code to be run
End Sub

Sub Restore_Button_Click()
    Workbooks.Open(TemporaryFileName)
    ThisWorkbook.Close False ' Won't save. Maybe set to true if you don't want to lose it just yet

 End Sub

您可能还需要添加一个按钮以将其保存为文件最初调用的任何名称,以便“新”备份工作簿替换被宏损坏的工作簿。

希望对你有帮助

【讨论】:

  • SaveAs 将工作簿更改为新名称。 SaveCopyAs 会更好,因为它会在不更改工作簿名称的情况下保存副本。
猜你喜欢
  • 2014-12-08
  • 2022-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
相关资源
最近更新 更多