Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在保存后使用copy创建文件备份会陷入无休止的循环_Excel_Vba_Backup - Fatal编程技术网

Excel 在保存后使用copy创建文件备份会陷入无休止的循环

Excel 在保存后使用copy创建文件备份会陷入无休止的循环,excel,vba,backup,Excel,Vba,Backup,我编写了一个代码,在用户保存工作簿时运行,该代码保存另一个副本,然后再次保存原始文件,以避免用户编辑“备份”工作簿 一旦它再次保存原始文件,“after_save”触发器将被触发,并保持无限保存 我在这里检查了StackOverFlow的解决方案,但没有找到 Private Sub Workbook_AfterSave(ByVal Success As Boolean) Call SaveToLocations End Sub Sub SaveToLocations() Dim WoE

我编写了一个代码,在用户保存工作簿时运行,该代码保存另一个副本,然后再次保存原始文件,以避免用户编辑“备份”工作簿

一旦它再次保存原始文件,“after_save”触发器将被触发,并保持无限保存

我在这里检查了StackOverFlow的解决方案,但没有找到

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

要创建存档,您需要在打开工作簿时保存它,而不是在用户关闭工作簿时保存它。下面的代码处理此问题:

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

这只会保存备份,并在最后将编辑保存给用户。

要创建存档,您需要在打开工作簿时保存,而不是在用户关闭工作簿时保存。下面的代码处理此问题:

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

这只会保存备份,并在最后将编辑留给用户保存。

使用
SaveCopyAs
避免重新保存,并尝试使用
If Workbook.Saved=True
以避免进入保存循环首先,如果要保留存档,则应在用户打开工作簿时运行,而不是在应用更改且用户尝试保存工作簿时运行。您所谓的“原件”将只是已编辑工作簿的另一份副本。作为应用程序逻辑的一部分,您应该将变量
Public SaveCopy管理为Boolean
,该变量将指示是保存还是注释编辑:这是一个非常好的观点@Masoud,它起到了作用,您应该将其作为答案发布,以便我可以将其标记为已回答。使用
SaveCopyAs
避免重新保存,并尝试使用
If Workbook.Saved=True
以避免进入保存循环首先,如果要保留存档,则应在用户打开工作簿时运行,而不是在应用更改且用户尝试保存工作簿时运行。您所谓的“原件”将只是已编辑工作簿的另一份副本。作为应用程序逻辑的一部分,您应该将变量
Public SaveCopy管理为Boolean
,该变量将指示是保存还是注释编辑:这是一个非常好的观点@Masoud,它起到了作用,您应该将其作为答案发布,以便我可以将其标记为已回答。我会将扩展名保留在名称中(last.xls将是扩展名),以便记录文件的实际扩展名。我会将扩展名保留在名称中(last.xls将是扩展名)为了保持记录,文件的实际扩展名是什么。