繁体   English   中英

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

[英]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程序,以回溯您所做的所有更改。 根据您执行的操作,与仅关闭而不保存和重新打开相比,将其反转可能是一件非常复杂的事情。 但是,如果你坚持,无论如何,要把自己打倒!

  1. 在运行宏之前保存原始工作簿的副本。 在子例程的开始使用.SaveAs方法。
  2. 在原始工作簿中运行VBA宏例程。
  3. 现在有第二个宏“撤消VBA更改”,它从步骤(1)打开工作簿副本,关闭在步骤(2)中运行宏的工作簿,并再次调用.SaveAs方法,从步骤(2)覆盖现有工作簿。

注意:为了使这个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM