有人可以告诉我如何撤消对工作簿的所有更改? 我有文件excel1.xlsx,我已经使用vba对excel.xlsx进行了排序和许多操作。但最后我希望excel1.xlsx与开头的相同。如何使用vba撤消所有更改?
activeworkbook.saved = True
我发现它保留了所有内容,但是它没有工作。所以有任何命令我可以在执行操作后取回原始文件。是的
wb1.Sheets(1).Activate
ActiveWorkbook.Close savechanges:=False
它有效但我不希望我的工作簿被关闭它应该仍然打开。我怎么做到的?提前谢谢。
答案 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)
注意: 为了让这个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