2017-06-09 59 views
0

我得到當我打電話一個錯誤:其被定義爲Datascrape()獲取錯誤91在運行中的數據刮代碼

Sub Datascrape() 
    Dim count, i As Long 
    Dim ie As Object 
    count = Sheets("properties-2017-06-05").Cells(1, 10).Value 
    Sheets("properties-2017-06-05").Range("D7:E" & count).ClearContents 
    For i = 7 To count 
    Set ie = CreateObject("internetexplorer.Application") 
    ie.navigate Sheets("properties-2017-06-05").Cells(i, 3).Value 
    While ie.busy 
     DoEvents 
    Wend 
    'ie.Visible = True 
    Application.Wait (Now + TimeValue("00:00:03")) 
    Sheets("properties-2017-06-05").Cells(i, 4) = 
    'error happens here 
    ie.document.getelementsbyclassname("col-xs-12 viewAllReviews")(0).innertext 
    On Error Resume Next 
    Sheets("properties-2017-06-05").Cells(i, 5) = 
    ie.document.getelementsbyclassname("APGWBigDialChart widget")(0).getElementsByTagName("text")(1).innertext 
    On Error Resume Next 
    ie.Quit 
    Next 
End Sub 

後約3或4次迭代循環的,它拋出一個Error 91和我不懂爲什麼。

link to picture

+0

對於初學者,您不應該在循環中創建IE *。對於(可能)等待網頁加載而言,Application.Wait最多是一種不可靠的方法。那是你想要做什麼? –

+0

我需要實際瀏覽不同的網址。如果我不創建ie對象,那麼我得到運行時錯誤, –

回答

0

運行時,當對象的計算結果爲Nothing因爲你鏈接(0)(指數)針對可能不會返回一個有效的對象/集合的表達錯誤91會發生。

使用這種表達,

ie.document.getelementsbyclassname("col-xs-12 viewAllReviews")(0).innertext 

如果getElementsByClassName方法返回一個空的集合,然後試圖索引集合0將提高91錯誤。

從本質上講,你的代碼寫在假定調用此方法將總是結果長度集合> = 1

爲什麼不這樣?

您的等待循環和Application.Wait可能不夠。考慮修改等待循環:

While ie.busy and not ie.ReadyState = 4 
    DoEvents 
Wend 

威力足以解決問題。我也建議移動實例化外部的循環,沒有理由反覆創建循環內的ie對象。

肯定將避免錯誤,並建議/在調試的:

Sub Datascrape() 
Dim count as Long, i As Long 
Dim ie As Object 
Dim ws as Worksheet 

Set ws = Sheets("properties-2017-06-05") 
Set ie = CreateObject("internetexplorer.Application") 

count = ws.Cells(1, 10).Value 
ws.Range("D7:E" & count).ClearContents 
For i = 7 To count 
    ie.navigate ws.Cells(i, 3).Value 
    While ie.busy and not ie.ReadyState = 4 
     DoEvents 
    Wend 
    Application.Wait (Now + TimeValue("00:00:03")) '## This line probably isn't needed 
    Dim ele 
    Set ele = ie.document.getelementsbyclassname("col-xs-12 viewAllReviews") 
    If ele Is Nothing Then 
     MsgBox "Class name 'col-xs-12 viewAllReviews' isn't found!" 
     ws.Cells(i, 4) = "NOT FOUND" '## Breakpoint here if needed to debug 
    Else: 
     ws.Cells(i, 4) = ele(0).innerText 
    End If 
    On Error Resume Next 
    ws.Cells(i, 5) = _ 
     ie.document.getelementsbyclassname("APGWBigDialChart widget")(0).getElementsByTagName("text")(1).innertext 
    On Error GoTo 0 
Next 
ie.Quit 
End Sub 

注:爲了提供更具體的指導,你需要提供例如輸入,這將有助於重現錯誤。

此外,在您的錯誤處理

記你有On Error Resume Next則表達式,然後On Error Resume Next,你的循環中。這幾乎肯定不是你想要的。通常情況下,它是這樣的:

On Error Resume Next 
<< expression(s) >> 
On Error GoTo 0 

鑑於你有:

On Error Resume Next 
<< expression(s) >> 
On Error Resume Next 

除非你確實有前,好像你的循環不能可能引發錯誤除了在第一個迭代。 GoTo 0恢復正常的錯誤處理,Resume Next僅僅意味着「假裝錯誤沒有發生,即使它們是」。它不提供可用於排除故障的診斷信息。作爲一個經驗法則,應該避免(除少數例外)。你所做的是基本上允許迭代1的錯誤,但是抑制所有其他錯誤。

+0

什麼行引發錯誤?並且可以提供示例輸入嗎? –

+0

運行代碼後,我仍然收到錯誤91。 運行代碼後,我仍然收到錯誤91。 Dim ele ele = ie.document.getelementsbyclassname(「col-xs-12 viewAllReviews」) 如果ele.length = 0那麼'錯誤91發生在這裏。如果需要進行調試 –

+0

apartmentratings.com/fl/davie/palm-ranch-apartments_9199332346275159825/ 我需要列出評論和整體評分不同的屬性,如網址中提到的屬性。 –