Excel 加载项,何时检查更新?

标签 excel vba

我已经制作了一个有用的 Excel VBA 加载项,几乎可以发布了。我只有一个问题。我希望加载项在运行时检查更新,并在用户使用旧版本时通知用户。

我编写了一个公共(public)子程序,它将使用 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 版本,所以我仍然需要解决。

最佳答案

好的,我运行了您的代码并使用 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

使用此代码,您的更新过程将在激活工作簿时运行。它似乎不会在那里引起问题。

请让我知道这是否有效。祝你好运。

关于Excel 加载项,何时检查更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41150748/

相关文章:

vba - 动态改变编号VBA 数组的维数

vba - 在运行宏之前处理工作表更改事件

excel - 在 Excel 中反转过滤器选择

vba - Excel VBA 正在跳过特定的代码行

vba - excel vba宏匹配来自两个不同工作簿的单元格并相应地复制和粘贴

excel - 用户窗体中的月 View - 自动关闭

Excel 2007 - 查找一个单词

xml - 我想隐藏(不禁用) 'protect workbook' 命令栏 Excel(customUI)的评论选项卡

windows - winapi查找网页对话框的子窗口标题(属性)

Excel 应用程序的体系结构