2013-08-16 84 views
1

當前的代碼如下:VBA:試圖訪問的網站,但網站偶爾會無法加載

Set IE = CreateObject("InternetExplorer.Application") 
IE.Navigate "https://www.website.com/" 
Application.StatusBar = "https://www.website.com/ is loading. Please wait..." 
Do While IE.Busy 
    Application.Wait DateAdd("s", 1, Now) 
    Loop 
Application.StatusBar = "Search form submission. Please wait..." 

我遇到的問題是,「https://www.website.com/」無法從時間加載時間(我相信這是由於我反覆訪問它)。其結果是,該代碼永遠不會超越了這個循環:

Do While IE.Busy 
    Application.Wait DateAdd("s", 1, Now) 
    Loop 

一個合乎邏輯的解決方案,在我看來,是殺IE和一定的時間限制後重新啓動整個過程(30秒?)已經達到。請告知如何編碼此解決方案,和/或如何編寫更有效的解決方案。非常感謝你!而且我使用IE10,如果這很重要的話。

而且,這裏是一個鏈接,我發現了有些相關的相關信息: http://www.ozgrid.com/forum/showthread.php?t=161094

+0

您在宏完成執行代碼後是否將'IE'設置爲空? – Jaycal

+0

是的,先生!代碼最後清理很多。 – autzen7

回答

5

你可以嘗試修改代碼來讀取

Sub LoadWebsite() 
Dim iSecondCounter As Integer 
Static iAttempts As Integer 

iAttempts = iAttempts + 1 

Set ie = CreateObject("InternetExplorer.Application") 
ie.Navigate "https://www.website.com/" 
Application.StatusBar = "https://www.website.com/ is loading. Please wait..." 

iSecondCounter = 0 
Do While ie.Busy And iSecondCounter < 30 
    Application.Wait DateAdd("s", 1, Now) 
    iSecondCounter = iSecondCounter + 1 
Loop 
If iSecondCounter = 30 Then 
    ie.Quit 
    If iAttempts <= 3 Then Call LoadWebsite 
End If 

Set ie = Nothing 
End Sub 
+1

謝謝你。然後,如果IE被殺死了,我怎麼會有條件地循環回去呢? – autzen7

+0

嗨我已編輯的代碼,使其成爲一個遞歸子程序,如果IE失敗並被殺死,然後subriutine將再次運行,但如果3次後,它仍然沒有加載它會放棄(保存你從一個無限循環) 。 –

+0

因此,代碼現在代表: '調用LoadWebsite Set objCollection = IE.document.getElementsByTagName(「input」)' 並導致此錯誤:Object variable或With block variable not set。 – autzen7

0

OK,你似乎可以提出一個新的有關獲取HTML元素集合的問題,所以我會將其作爲新答案發布。您收到對象錯誤的原因似乎是因爲您沒有將objCollection標註爲正確的對象。我已經修改了原始答案中的代碼,並將其設置爲您的代碼片段。要使用此代碼,我必須包含對Microsoft HTML對象庫的引用。

請注意,這段代碼在退出子文件之前破壞了元素集合,你可能想要對它做些什麼。

Sub LoadWebsite() 
Dim iSecondCounter As Integer 
Static iAttempts As Integer 
Dim objCollection As IHTMLElementCollection 
iAttempts = iAttempts + 1 

Set ie = CreateObject("InternetExplorer.Application") 
ie.Navigate "https://www.website.com/" 
Application.StatusBar = "https://www.website.com/ is loading. Please wait..." 

iSecondCounter = 0 
Do While ie.Busy And iSecondCounter < 30 
    Application.Wait DateAdd("s", 1, Now) 
    iSecondCounter = iSecondCounter + 1 
Loop 
If iSecondCounter = 30 Then 
    ie.Quit 
    If iAttempts <= 3 Then Call LoadWebsite 
End If 


Set objCollection = (ie.Document.getElementsByTagName("INPUT")) 

Cleanup: 

Set ie = Nothing 
Set objCollection = Nothing 

End Sub 
0

也許你可以添加代碼,以幫助你等待它加載和X秒後,你可以決定是否要等待,或者你可以優雅地退出/做別的事情(發佈消息等)

ie.Navigate "http://www.website.com" 
Application.Wait Now + TimeSerial(0, 0, 3) 

Do While ie.Busy 
    DoEvents 
Loop