2016-12-14 96 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 

使用此代碼,您的更新過程將在工作簿激活時運行。這似乎不會導致那裏的問題。

請讓我知道這是否有效。祝你好運。