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

Posted

技术标签:

【中文标题】API 计时器启动 Workbook.close 时 Excel 2016 崩溃【英文标题】:Excel 2016 crash on API timer initiated Workbook.close 【发布时间】:2016-03-19 20:24:09 【问题描述】:

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

编辑:下面链接中的工作簿只有计时器和退出模块,并且具有相同的行为,因此内容没有问题。

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

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

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

从用户窗体调用相同的子程序没有问题。工作簿关闭时 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

【问题讨论】:

【参考方案1】:

Excel vba 中的计时器是通过使用 Application.OnTime 命令或 windows 计时器完成的,就像您正在使用的那样。

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

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

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

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

【讨论】:

从 application.ontime 关闭 Excel 实例更糟糕。 Excel 不会崩溃,而是会关闭/重新启动几次/多次,并且可能需要通过任务管理器终止才能停止它。

以上是关于API 计时器启动 Workbook.close 时 Excel 2016 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Windows API——进程和线程函数

Linux内核定时器

js 性能检测

004_软件定时器

UCOS-Ⅲ:软件定时器

sylixos定时器使用