Application.OnTime在更改活动文档后停止触发

时间:2017-03-22 10:38:26

标签: vba ms-word word-vba

我正在尝试为从某个模板创建的所有文档实现自动保存功能。在这个模板中,我为测试创建了以下内容:

Dim doc As Document
Dim count As Integer

Private Sub Document_Open()
count = 1
Set doc = ActiveDocument
SaveTime
End Sub

Sub SaveTime()
Application.OnTime When:=Now + TimeValue("00:00:15"), _
name:="DoSave"
End Sub

Sub DoSave()
doc.SaveAs2 "c:\test\testsave" & count & ".docx"
count = count + 1
SaveTime
End Sub

现在,如果我打开由此模板创建的文档,则自动保存按预期每15秒工作一次(15秒+具有不同名称的计数器仅用于测试)。

但是一旦我在Word中创建新文档或打开另一个文件,第一个文档中的自动保存就会停止工作,如果我继续在文档中工作,也不会再回来。

无论哪个文档处于活动状态,如何使自动保存工作?像这样,只有当一个文档一次打开时,该功能才有效,当然我无法保证。

1 个答案:

答案 0 :(得分:0)

在这里黑暗中拍摄,但是你在模块的范围内调暗文档(从我所知道的)。打开新文档可能会导致超出范围。最好只在例程之间传递文档。

这样的事情:

' This will declare count within the scope of the module
Private count As Integer

Private Sub Document_Open()
    count = 1
    SaveTime ActiveDocument
End Sub

Sub SaveTime(doc as Document)
    Application.OnTime When:=Now + TimeValue("00:00:15"), "'DoSave doc'"
End Sub

Sub DoSave(doc as Document)
    doc.SaveAs2 "c:\test\testsave" & count & ".docx"
    count = count + 1
    SaveTime
End Sub

我没有太多使用OnTime,所以如果上面的语法不允许传递参数,那么这是一个使用私有doc变量的版本。

' This will declare count and doc within the scope of the module
Private count As Integer
Private doc as Document

Private Sub Document_Open()
    count = 1
    SaveTime
End Sub

Sub SaveTime()
    Application.OnTime When:=Now + TimeValue("00:00:15"), "DoSave"
End Sub

Sub DoSave()
    doc.SaveAs2 "c:\test\testsave" & count & ".docx"
    count = count + 1
    SaveTime
End Sub

我希望这会有所帮助。我主要在Excel中为VBA工作,所以如果我不在这里,我会道歉。

编辑:

我明白了。发生的事情是每次你的保存事件触发时都会将活动文档保存为新文件,但它不会创建新实例。例如,如果test是您的第一个文档,那么:

测试打开>事件火灾>测试变为Test2.docx(Event Fires> Test2变为Test3等。

由于代码仍以某种方式存储在内存中(这是我不完全理解的部分,但据我所知,它正在发生的事情)事件仍然会触发。问题是,打开一个新文档会以某种方式刷新此事件并取消事件。

有一个简单的解决方法,见下文:

Option Explicit
Private doc As Document
Private count As Integer
Private Sub Document_Open()
    count = 1
    Set doc = ActiveDocument
    SaveTime
End Sub
Sub SaveTime()
    Application.OnTime Now + TimeValue("00:00:15"), "DoSave"
End Sub

Sub DoSave()
    doc.Save
    Application.Documents.Add doc.FullName

    ActiveDocument.SaveAs2 "c:\test\testsave" & count & ".docx"
    ActiveDocument.Close

    count = count + 1
    SaveTime
End Sub

这将创建文档的新实例,保存此新实例,然后将其关闭。这使旧实例保持正常运行。

我希望一切都有道理。不可否认,即使持有代码的文档不再存在,我也不清楚为什么代码仍留在内存中。