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

Reu*_*loy 5 excel vba timer excel-vba

我有一个工作簿,当关闭由API计时器触发时,关闭Excel崩溃.

编辑:下面的链接中的工作簿只有计时器和退出模块,它具有相同的行为,所以它不是内容的问题.

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

工作簿关闭后几秒钟Excel崩溃.我试过关闭计时器,取消隐藏所有床单,卸载表格...所有对象都设置为Nothing.

我所做的只是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
Run Code Online (Sandbox Code Playgroud)

定时器触发的代码是;

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
Run Code Online (Sandbox Code Playgroud)

用户形式说;

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

rdn*_*ega 0

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

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

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

在这两种情况下,您的预定程序似乎仍在运行。

我建议您研究一下并考虑使用 application.ontime。