2017-05-24 246 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