我已经制作了一个有用的Excel VBA插件,我几乎准备好发布了。我只有一个问题。我希望加载项在运行时检查更新,并通知用户他们是否使用旧版本。
我已经编写了一个公共子程序,它将使用Internet Explorer自动化检查我的网站以获取更新。我手动运行时工作正常。
我的问题是,我什么时候应该致电CheckForUpdate()
子?我已尝试将其放入Workbook_Open()
,但我发现的问题是,如果耗时太长,则会阻止Excel正确加载。
加载项编写器是否有标准方法检查更新?当我在Workbook_Open()
中有代码时,Excel为什么不加载工作簿?
谢谢!
修改:这是我的整个代码。如果将其添加到加载项工作簿,然后激活加载项,则无法打开任何Excel文件。
Private Sub Workbook_Open()
Call CheckForUpdate
End Sub
Public Sub CheckForUpdate()
Dim ie As Object
Set ie = CreateObject("internetexplorer.application")
ie.Visible = False
ie.navigate "https://example.com/checkforupdate"
Do While ie.readystate <> 4: DoEvents: Loop
Set HTML = ie.document
If HTML.DocumentElement.innerHTML = "update is available" Then
MsgBox "An update is ready. Go get it!"
Else
MsgBox "no update"
End If
Set ie = Nothing
End Sub
更新:我现在已在三台计算机上进行了测试。其中2个有Excel 2013,问题就出现了。一个有Excel 2016,它没有问题。我想支持所有Excel版本,所以我仍然需要解决。
答案 0 :(得分:3)
好的,我运行你的代码并使用Excel 2013重现了这个问题。我没有测试任何其他版本。
看起来会发生的情况是,如果您的代码在工作簿可见之前运行,则会导致问题。我认为它与IE部分有关,而不是其他任何事情。
我尝试使用Application.OnTime Now + TimeValue("00:00:15"), "CheckForUpdate"
。问题在于,如果用户启动excel并在打开工作簿之前等待计时器,则会出现完全相同的问题。我怀疑建议异步VBScript的人会有完全相同的问题,但是要复杂得多。
所以让我们变得简单。您要求提供比Workbook_Open()
更好的代码放置代码。有一个。
这对我有用:
启动新的加载项项目。将您的CheckForUpdates
功能添加到新模块。将以下代码添加到ThisWorkbook
。
Private WithEvents App As Application
Private Sub App_WorkbookActivate(ByVal Wb As Workbook)
CheckForUpdate
End Sub
Private Sub Workbook_Open()
Set App = Application
End Sub
使用此代码,您的更新过程将在激活工作簿时运行。它似乎不会引起问题。
如果有效,请告诉我。祝你好运。