Application.OnTime 在加载项中 Workbook_Open

Application.OnTime in Add-In Workbook_Open

我已经构建了一个自定义的 Excel 加载项,目前我正在尝试找出一种方法,以便在新版本的加载项可用时通过 VBA 提示用户。

我尝试仅使用 workbook_open 事件来检查最新版本,然后使用用户表单提示用户,但我发现当 Excel 加载触发用户表单的加载项时, Excel 停止加载用户实际尝试打开的工作簿并重新加载加载项。因此,虽然用户窗体按我想要的方式工作,但用户会得到一个空白(未读取任何表格)Excel shell 并加载了加载项。

所以我考虑使用 Application.OnTime 来推迟 VBA 直到加载项和目标文件都打开之后。我的印象是 here and here 这是可能的,但我只能让它在 .xlsm 文件而不是 .xlam 文件中工作。

这是我正在测试的代码:

Sub Workbook_Open()
    Application.OnTime Now() + TimeValue("00:00:05"), "Test_Addin.xlam!Versioning.Notify_User"
End Sub

并且在常规代码模块中:

Sub Notify_User()
    MsgBox "Hello"
End Sub

那么,我的问题是:我是不是做错了什么?

我想知道是否有关于加载项如何 loaded/designed 阻止其执行此类操作的内容。

或者,您能想到其他方法吗?

我读了 Dick Kusleika 关于这个主题的 interesting blog post(和评论),但听起来有些人在每个子过程中都进行了版本检查......我有很多过程,所以这个听起来不是一个好的选择,尽管我可能不得不求助于它。

时间紧迫,所以我采用了最不理想的选择:在每个程序开始时进行检查。

对于有兴趣的人,我是这样做的:

我在每个子过程开始的某个地方放了这行代码:

If Version_Check Then Call Notify_User

在我的版本控制模块中,我放置了这个函数和过程:

Function Version_Check() As Boolean
    Installed = FileDateTime(ThisWorkbook.FullName)
    Available = FileDateTime("\NetworkDrive\Test_AddIn.xlam")
    If Installed < Available Then Version_Check = True
End Function

Sub Notify_User()
    Update_Check.Show
End Sub

因此,每次过程 运行 此代码都会检查我们公司网络上的版本,该版本的修改日期时间大于已安装加载项的日期时间。

我仍然对检查新版本的其他方法持开放态度,因此请随时 post 回答。