在Excel崩溃导致无法恢复工作簿的几个VBA工作小时后,我决定尝试编写自己的自动保存模块。它利用Application.OnTime
方法定期保存,并且留给自己,它实际上做了它应该做的事情。
我将项目拆分为类模块和常规模块,因为I read here Application.OnTime
无法访问类对象方法。这是我的两个模块的核心(剥离了不相关的东西)。代码段中引用了两个使用get / let,pInterval
和pTimedSub
的属性。将它们分别视为"00:00:30"
和"Repeat_AutoSave"
。
CAutoSave.cls
Private pTimeReference As Date
Private pInterval As Date
Private pTimedSub As String
Public Property Let Interval(interval As String)
' Perform checks to see if interval is hh:mm:ss
pInterval = TimeValue(interval)
End Property
Public Property Let TimedSub(subname As String)
pTimedSub = subname
End Property
Public Sub Enable()
Me.Repeat
End Sub
Public Sub Repeat()
ThisWorkbook.SaveCopyAs "C:\Excel\wb.autosave.1.xlsm"
' pInterval is in the hh:mm:ss format
pTimeReference = Now + pInterval
' pTimedSub is set to Repeat_AutoSave
Application.OnTime pTimeReference, pTimedSub
End Sub
Public Sub Disable()
If Not pTimeReference > TimeValue("00:00:00") Then
Exit Sub
End If
' pTimedSub is set to Repeat_AutoSave
Application.OnTime pTimeReference, pTimedSub, , False
pTimeReference = "00:00:00"
End Sub
AutoSave.bas
Private a As New CAutoSave
Public Sub Create()
a.Interval = "00:00:30"
a.TimedSub = "Repeat_AutoSave"
a.Enable()
End Sub
Public Sub Destroy()
a.Disable()
End Sub
Public Sub Repeat_AutoSave()
a.Repeat
End Sub
现在,如前所述,留给自己这很好。重置项目时出现问题。通过在Excel的解析器抛出的任何错误上按“结束”,或者只需按下IDE中的停止按钮。这将引发以下错误:Method 'OnTime' of object '_Application' failed
。
我最初的直觉是使用Application
中的CAutoSave.Repeat
将a.Repeat Application
传递给AutoSave.bas
并在CAutoSave.cls
中使用以下子声明:
Public Sub Repeat(ByRef app As Application)
' ...
app.OnTime pTimeReference, pTimedSub
End Sub
但是同样的错误也让我失望了。这里究竟发生了什么,是否有任何方法可以阻止或规避它,以便自动保存不会中断?