在使用VBA对excel文件执行所有操作后,如何取回原始文件?

时间:2011-08-09 08:10:27

标签: excel vba excel-vba excel-2007

有人可以告诉我如何撤消对工作簿的所有更改? 我有文件excel1.xlsx,我已经使用vba对excel.xlsx进行了排序和许多操作。但最后我希望excel1.xlsx与开头的相同。如何使用vba撤消所有更改?

 activeworkbook.saved = True

我发现它保留了所有内容,但是它没有工作。所以有任何命令我可以在执行操作后取回原始文件。是的

              wb1.Sheets(1).Activate
              ActiveWorkbook.Close savechanges:=False

它有效但我不希望我的工作簿被关闭它应该仍然打开。我怎么做到的?提前谢谢。

4 个答案:

答案 0 :(得分:4)

为了撤消子例程,您可以选择不保存文件并只关闭它,或者您必须编写一个特殊的子例程来保存文件的状态,然后恢复状态(自定义撤消) 。这是子例程的一个难点,就是它们无法通过正常的撤消来解除。包括我在内的大多数人都会建议您使用备份。

在进行自定义撤销程序时,最重要的问题是您需要将状态保存为什么?保存有关该文件的所有信息将非常繁重,因此最好知道要保存的内容。

<强>更新: 如果您只有一张数据,这是一种备份工作表的脏方法。这更像是一种创建备份而非最终完美代码的方法的概念证明。它只是创建了电流表的备份副本,当你恢复时,你只需要删除原始工作表并将备份重命名为以前调用的内容。 :P

如何测试: 将一些数据和值放在原始工作表中,然后运行Test()子程序!

Public backupSheet As Worksheet
Public originalSheet As Worksheet
Public originalSheetName As String

Sub CreateBackup()
    Set originalSheet = Application.ActiveSheet
    originalSheetName = originalSheet.Name
    originalSheet.Copy After:=Sheets(Application.Worksheets.Count)
    Set backupSheet = Application.ActiveSheet
    backupSheet.Name = "backup"
    originalSheet.Activate
End Sub

Sub RestoreBackup()
    Application.DisplayAlerts = False
    originalSheet.Delete
    backupSheet.Name = originalSheetName
    Application.DisplayAlerts = True
End Sub

Sub ZerosFromHell()
    Range("A1:Z100").Select
    Cells.Value = 0
End Sub

Sub Test()
    Call CreateBackup
    Call ZerosFromHell
    MsgBox "look at all those darn 0s!"
    Call RestoreBackup
End Sub

答案 1 :(得分:3)

简短的回答:你做不到。遗憾。

使用VBA对工作表所做的更改无法通过单击按钮或使用单个标准VBA语句撤消。

正确的做法似乎是:在工作表的副本上执行VBA驱动的工作,如果您不想保留更改,则删除/不保存此副本(并重新打开原始文件)如果你需要这样做)。但是从你的问题来看,听起来你不想这样做。

然后,您唯一的选择就是编写自己的VBA程序,以回溯您所做的所有更改。根据您执行的操作,与仅关闭而不保存和重新打开相比,将其反转可能是一件非常复杂的事情。但是,如果你坚持,一定要把自己打倒!

答案 2 :(得分:1)

  1. 在运行宏之前保存原始工作簿的副本。在子例程的开始使用.SaveAs方法。
  2. 在原始工作簿中运行VBA宏例程。
  3. 现在有第二个宏“撤消VBA更改”,它从步骤(1)打开工作簿副本,关闭在步骤(2)中运行宏的工作簿,并再次调用.SaveAs方法覆盖现有工作簿( 2)。
  4. 注意: 为了让这个UndoMacro工作,你需要把它放在一个Addin或一个单独的工作簿中(一个插件更干净)。这将允许您运行.SaveAs方法并覆盖步骤(2)中的原始工作簿,此时此步骤已关闭以防止发生VBA运行时错误消息。

答案 3 :(得分:0)

如果您的所有数据都整洁有序,那么效果非常好。就像OP一样,我需要回到Excel文件的原始状态,并且不想重新加载原始文件(由于老化的基础设施和慢速PC,加载大约需要25秒)

我所做的是将所有数据复制到变量数组中,对工作簿执行所有处理,然后将变量数组写回Excel文件(数据位于名为“Data”的工作表上,并启动在第2行,并使用A到Z列。虽然这使用了一点RAM,但读/写几乎是瞬时的。相关代码:

Dim varDataArray As Variant, wb As Workbook, ws As Worksheet, lngEndRow as Long

Set wb = ThisWorkbook
Set ws = ThisWorkbook.Worksheets("Data")

With ws
 ' This simply finds the last row with data
 lngEndRow = .Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
 ' This reads all cell data from A2 to Z###, where ### is the last row
 varDataArray = .Range("A2:Z" & lngNumberOfRows).Value

 ... do things ...

 ' This writes all the data back to Excel
 ' 26 is the numeric column equivalent to "Z"
 .Range("A2").Resize(lngEndRow, 26) = varDataArray

End With