![](/img/trans.png)
[英]Using Excel VBA, how do I keep my original code executing after a 'thisworkbook.close' event in a 2nd workbook?
[英]How do I get back my original file after performing all the Operations on the excel file using VBA?
任何人都可以告诉我如何撤消对工作簿的所有更改? 我有文件excel1.xlsx,我已经使用vba对excel.xlsx进行了排序和许多操作。 但最后我希望excel1.xlsx与开头的相同。 如何使用vba撤消所有更改?
activeworkbook.saved = True
我发现它保留了所有内容,因为它没有工作。所以有任何命令,我可以在对它执行操作后取回原始文件。 嗯,是
wb1.Sheets(1).Activate
ActiveWorkbook.Close savechanges:=False
它工作但我不希望我的工作簿被关闭它应该仍然打开。 我怎么做到的? 提前致谢。
要撤消子例程,您可以选择不保存文件并只关闭它,或者您必须编写一个特殊的子例程来保存文件的状态,然后恢复状态(自定义撤消)。 这是子例程的一个难点,就是它们无法通过正常的撤消来解除。 包括我在内的大多数人都会建议您使用备份。
在进行自定义撤销程序时,最重要的问题是您需要将状态保存为什么? 保存有关该文件的所有信息将非常繁重,因此最好知道要保存的内容。
更新 :如果您只有一张数据,这是一种备份工作表的脏方法。 这更像是一种创建备份而非最终完美代码的方法的概念证明。 它只是创建了电流表的备份副本,当你恢复时,你只需要删除原始工作表并将备份重命名为以前调用的内容。 :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
简短的回答:你做不到。 抱歉。
只需单击按钮或使用单个标准VBA语句,就无法撤消使用VBA对工作表所做的更改。
正确的做法似乎是:在工作表副本上执行VBA驱动的工作,如果您不想保留更改,则删除/不保存此副本(如果需要,请重新打开原件)这样做)。 但是从你的问题来看,听起来你不想这样做。
然后,您唯一的选择是编写自己的VBA程序,以回溯您所做的所有更改。 根据您执行的操作,与仅关闭而不保存和重新打开相比,将其反转可能是一件非常复杂的事情。 但是,如果你坚持,无论如何,要把自己打倒!
注意:为了使这个UndoMacro工作,你需要将它放在一个Addin或一个单独的工作簿中(一个插件更干净)。 这将允许您运行.SaveAs方法并覆盖步骤(2)中的原始工作簿,此时将关闭此工作簿以防止发生VBA运行时错误消息。
如果您的所有数据都是干净整洁的,那么效果非常好。 就像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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.