API计时器启动Workbook.close时Excel 2016崩溃



我有一个工作簿,当API计时器触发关闭时,它会在关闭时使Excel崩溃。

编辑:下面链接中的工作簿除了计时器和退出模块外什么都没有,而且它具有相同的行为,因此内容没有问题。

https://www.dropbox.com/s/x0xdwgj5h34ctdk/Book1.xlsm?dl=0

工作簿关闭几秒钟后Excel崩溃。我试过关闭计时器,取消隐藏所有纸张,卸载表单。。。所有对象都被设置为CCD_ 1。

我所做的只是Workbooks(ThisWorkbook.Name).Close SaveChanges:=True??!!

从UserForm调用相同的子,没有问题。工作簿关闭时Excel不会崩溃。

如何解决此问题?

Sub ApplicationExit()
'    Call UnloadAllForms
'    DoEvents
'    Sleep 1000
'    Call StopCloseTimer
'DoEvents
'If Application.Workbooks.Count = 1 Then
'    Workbooks(ThisWorkbook.Name).Save
'    Application.Quit
'Else
    DoEvents
    Workbooks(ThisWorkbook.Name).Close SaveChanges:=True
'End If
End Sub

计时器触发的代码为;

Sub TimerCalled()
If CloseTimerValue = "" Then Call Reset_CloseTimerValue
DoEvents
If basTimers.CloseTimerValue <= Now() And Not Unlocked Then Call ApplicationExit
On Error Resume Next 'In case sheet is protected
ThisWorkbook.Sheets("JobIndex").Range("CloseCount").Value = Format(Now() - CloseTimerValue, "hh:m:s")

End Sub

用户表单显示:;

CloseUp:
i = MsgBox("Close Project Register?", vbYesNo, MsgBoxTitle)
Select Case i
    Case vbYes
        Call ApplicationExit
    Case vbNo
        Workbooks(ThisWorkbook.Name).Save
End Select

excel vba中的计时器是通过使用Application.OnTime命令或windows计时器来完成的。

请注意,为了安排函数的调用(使用上面提到的命令),它使用了APPLICATION,这意味着它告诉EXCEL执行调用,而不是您的工作簿。因此,在您的情况下,工作簿已关闭,但要调用的过程仍计划在未来某个时间关闭。你得到的错误是excel没有找到过程,然后抛出一个错误。

在您的情况下,它崩溃的原因是您使用的是windows计时器。当您关闭工作簿时,您的lib32实例会丢失,当时间到来时,windows无法访问内存,然后会崩溃整个应用程序。

在这两种情况下,您的计划过程似乎仍在运行。

我建议您对此进行研究,并考虑使用application.ontime.

最新更新