2017-02-16 174 views
4

我有下面的行,當我運行它時失敗,但是當我在此行之前中斷應用程序時,它工作正常。excel VBA代碼在加入時運行,但不在運行時運行

I = InStr(html_document.body.innerHTML, "EPG") 

我是一個很長的,已初始化,應該工作正常。 html_document是IE.document,通過

Set IE = New InternetExplorer 

把一個斷點,這條線也可以正常工作之前進行初始化,我拿起正確的字符位置。

把一個斷點,該行後,I仍然爲0。

任何想法將非常感激。

+4

在獲取html_document之前是否在等待頁面加載?例如在使用'IE.Navigate'後,你需要做一些事情,比如'Do While IE.ReadyState <> 4:DoEvents:Loop' – Jordan

回答

0

嗯,有可能你的IE對象沒有完全加載,這意味着你的「I」變量將無法獲得一個值。 你可以嘗試先添加一個驗證:

Do While IE.busy 
    DoEvents 
Loop 

試圖粘貼的東西,找出該應用程序還沒有準備好這樣做時,我也有過類似的問題與VBA。東西幫我正在創造一個函數來執行類似這樣的任務:

在您的模塊的開頭聲明一個常數milisseconds:

Const ms As Double = 0.000000011574 

然後嘗試適應這爲您的需求:

Function Try_Something() as Boolean 
    On Error GoTo errorHandler 
    Application.Wait Now + ms * 50 

     'Do something here, such as checking if the value is obtainable' 
     var = InStr(html_document.body.innerHTML, "EPG") 

    Try_Something = True 
    Exit Function 
errorHandler: 
    Try_Something = False 
End Function 

這個函數的作用是封裝運行時錯誤,如果發生錯誤,並在連續嘗試之間增加50 ms的延遲,通常足以使您的代碼順利運行。在此之後,你原來的代碼看起來有點像:

Do until Try_Something = True 
    DoEvents 
Loop 
I = InStr(html_document.body.innerHTML, "EPG") 
2

你最好使用READYSTATE枚舉檢查該頁面已實際加載。

'READYSTATE_UNINITIALIZED = 0 
'READYSTATE_LOADING = 1 
'READYSTATE_LOADED = 2 
'READYSTATE_INTERACTIVE = 3 
'READYSTATE_COMPLETE = 4 


Dim IE As New InternetExplorer 
'// your other code here 
IE.Navigate "http://www.google.co.uk" 

While IE.ReadyState <> READYSTATE_COMPLETE 
    DoEvents 
Wend 

'// Following code will only run once the document has completely loaded. 

Set html_document = IE.Document 
I = InStr(html_document.body.innerHTML, "EPG") 

'// rest of your code here....