2016-12-14 104 views
1

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

我写了一个公共小组,将使用Internet Explorer自动化检查我的网站的更新。手动运行时它工作正常。

我的问题是,我应该何时打电话CheckForUpdate()子?我试过把它放在Workbook_Open(),但我发现的问题是,如果它太长,它会阻止正确加载Excel。

有没有标准的方式,附加的作家检查更新?为什么Excel在我的代码Workbook_Open()中没有加载工作簿?

谢谢!

编辑:这是我的整个代码。如果将其添加到加载项工作簿,然后加载项被激活,我无法打开任何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

我希望您的更新检查器可以在用户没有连接到互联网时正常退出。 – YowE3K

+0

显示'CheckForUpdate()'代码。哪一行代码花费的时间最长?您应该在另一个进程中运行检查,或者通过XHR以异步模式运行。 – omegastripes

+1

如果它干扰'Workbook_Open()',为什么不在工作簿加载后使用'Application.OnTime'来安排它10-15秒? – Comintern

回答

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 

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

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