Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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 VBA中的自动保存正在重新打开已关闭的文件_Excel_Vba - Fatal编程技术网

Excel VBA中的自动保存正在重新打开已关闭的文件

Excel VBA中的自动保存正在重新打开已关闭的文件,excel,vba,Excel,Vba,我在我的一些excel工作表中实现了一些代码,这些代码会导致文件定期自动保存。我在代码中遇到的问题是,当它被执行时,它会重新打开已经关闭的文件,这些文件也包含相同的代码 我正在寻找一种让VBA自动保存文档的方法,但如果文件未打开,它将不再运行 这是我实现的代码: 包含在“本工作簿”中: 包含在“模块3”中: 注意:所有文档之间的代码都是100%相同的(除了时间值,其中一些文档的时间值相差几个小时)。请尝试下一种方法: 将OnTime调用调整为更好的Sub: 将讨论中的子设为Private,并在模

我在我的一些excel工作表中实现了一些代码,这些代码会导致文件定期自动保存。我在代码中遇到的问题是,当它被执行时,它会重新打开已经关闭的文件,这些文件也包含相同的代码

我正在寻找一种让VBA自动保存文档的方法,但如果文件未打开,它将不再运行

这是我实现的代码:

包含在“本工作簿”中:

包含在“模块3”中:


注意:所有文档之间的代码都是100%相同的(除了时间值,其中一些文档的时间值相差几个小时)。

请尝试下一种方法:

  • OnTime
    调用调整为更好的
    Sub
  • 将讨论中的
    设为Private
    ,并在模块顶部创建一个新的
    Public
    变量:
  • 清除已设置的OnTime过程:
  • 前两项将解决在调用活动工作簿过程时打开其他工作簿的问题。但是,这种情况不应该发生,我担心这不是真正的打开机制,工作簿是通过自己的OnTime函数调用打开的


    如果我的上述假设是
    正确的
    仅第3项就可以解决问题…

    正如您可能注意到的,
    OnTime
    是一种
    应用程序
    方法,而不是
    工作簿
    方法

    这意味着,即使关闭工作簿,只要Excel应用程序仍处于打开状态,
    OnTime
    仍在倒计时。一旦它达到零,它将尝试运行子例程-但工作簿已关闭。Excel不会抛出错误,而是重新打开工作簿,然后运行子例程

    为了停止此操作,您需要在关闭工作簿之前取消子程序的计划,这也意味着要存储时间。因此,您需要一个如下所示的模块:

    Option Private Module
    Option Explicit
    
    Private AutoRunTime AS Date
    
    Public Sub AutoSaveWorkbook()
        ThisWorkbook.Save
    
        AutoRunTime = Now()+TimeSerial(3,0,0) '3 hours
        Application.OnTime AutoRunTime, "AutoSaveWorkbook", True
    End Sub
    
    Public Sub CancelAutoSave()
        Application.OnTime AutoRunTime, "AutoSaveWorkbook", False
    End Sub
    

    然后,在
    Workbook\u Open
    中,您甚至可以调用
    AutoSaveWorkbook
    开始工作,在
    Workbook\u BeforeClose
    中,您甚至可以调用
    CancelAutoSave
    结束工作

    为什么要使用VBA?Excel内置了它。内置的自动保存功能将只保存到一个驱动器,而不会保存到公司的服务器。它已通知他们无法修改(或只是拒绝),因此我唯一的选择是VBA。您可以使用关闭事件取消OnTime以取消
    OnTime
    过程
    早期时间
    必须匹配:您的代码只会取消您在运行
    Save1
    后一秒钟内关闭工作簿的操作…@Chronocidal:是的,您是对的。我必须创建一个
    Public
    变量以保持la上次计划的时间。。。谢谢
    Sub Save1()
    Application.DisplayAlerts = False
    ThisWorkbook.Save
    Application.DisplayAlerts = True
    
    Application.OnTime Now + TimeValue("03:00:00"), "Save1"
    End Sub
    
    Private Sub Workbook_Open()
     scheduleTime = Now + TimeValue("03:00:00")
     Application.OnTime scheduleTime, "Module3.Save1"
    End Sub
    
    Public scheduleTime As Date
    
    Private Sub Save1()
     Application.DisplayAlerts = False
       ThisWorkbook.Save
     Application.DisplayAlerts = True
     
     scheduleTime = Now + TimeValue("03:00:00")
     Application.OnTime scheduleTime, "Module3.Save1"
    End Sub
    
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
      Application.OnTime scheduleTime , "Module3.Save1", , False
    End Sub
    
    Option Private Module
    Option Explicit
    
    Private AutoRunTime AS Date
    
    Public Sub AutoSaveWorkbook()
        ThisWorkbook.Save
    
        AutoRunTime = Now()+TimeSerial(3,0,0) '3 hours
        Application.OnTime AutoRunTime, "AutoSaveWorkbook", True
    End Sub
    
    Public Sub CancelAutoSave()
        Application.OnTime AutoRunTime, "AutoSaveWorkbook", False
    End Sub