2017-05-24 247 views
0

我写了一个代码在用户保存工作表时运行,此代码保存另一个副本,然后再次保存原始文件,以避免用户编辑“备份”工作簿。然而,一旦它再次保存原始文件,“after_save”触发器被触发并保持无穷大。 已经在这里检查了解决方案StackOverFlow,但没有找到一个解决了我的问题。VBA保存副本after_save,进入无尽循环

Private Sub Workbook_AfterSave(ByVal Success As Boolean) 
Call SaveToLocations 
End Sub 

Sub SaveToLocations() 
Dim WoExt, Ext, BkPath, nDateTime As String 
    Static OrigName As String 

    'defining variables 
    nDateTime = Format(Now, "YYMMDD") 
    OrigName = "C:\Users\xxx.xxx\Desktop\vbatest\test orig.xlsm" 
    Ext = ".xls" 
    WoExt = "test orig" 
    BkPath = "C:\Users\xxx.xxx\Desktop\vbatest\Backup\" 
     Application.DisplayAlerts = False 
     ActiveWorkbook.SaveAs (BkPath + WoExt + " - Backup - " + nDateTime + Ext) 
     ActiveWorkbook.SaveAs OrigName 
     Application.DisplayAlerts = True 
End Sub 
+3

使用'SaveCopyAs'避免重新保存,并尝试使用'If Workbook.Saved = True'来避免进入保存循环 – Wolfie

+0

首先,如果您想保留档案,应在用户打开工作簿时运行而不是当应用更改并且用户正在尝试保存它时。你所谓的原创只是编辑工作手册的另一个副本。 – Masoud

+0

作为应用程序逻辑的一部分,您应该管理一个变量'Public SaveCopy As Boolean',它将指示是否保存 –

回答

0

要创建一个档案,您需要在打开时保存工作簿,而不是在用户关闭时保存工作簿。下面的代码需要照顾到这一点:

Private Sub Auto_Open() 
Dim WoExt, Ext, BkPath, nDateTime As String 

On Error GoTo ErrorHandler: 

    'defining variables 
    nDateTime = Format(Now, "YYMMDD") 
    Ext = ".xls" 
    WoExt = ThisWorkbook.Name 
    BkPath = "C:\Users\xxx.xxx\Desktop\vbatest\Backup\" 

     Application.DisplayAlerts = False 
     ActiveWorkbook.SaveCopyAs (BkPath + WoExt + " - Backup - " + nDateTime + Ext) 
     Application.DisplayAlerts = True 


Exit Sub 

ErrorHandler: 
      MsgBox "Backup has not been saved." 
End Sub 

这只是保存备份,并保留编辑到最后的用户。

+0

为了保留记录文件的实际扩展名,我会在名称中保留扩展名(最后的.xls将作为扩展名)。 – Masoud