2015-12-16 8 views
2

Я получаю ошибку времени выполнения 91 Переменная объекта или блока, не заданная для строки ниже < - Ошибка здесь !!Ошибка времени выполнения 424 Требуемый объект

Set html = CreateObject("htmlfile") 
    html.body.innerHTML = XMLHTTP.ResponseText 
    Set objResultDiv = html.getElementById("rhs_block")(0) ' <- Error Here!! 
    Set objH3 = objResultDiv.getElementsByTagName("div")(7).getElementsByTagName("a")(2).getElementsByTagName("span")(0).innerHTML 
    Cells(i, 2) = objH3 

Я искал в Stackoverflow, но не нашел ответа для этого.

Полный код VBA:

Sub XMLHTTP() 

Dim url As String, lastRow As Long 
Dim XMLHTTP As Object, html As Object, objResultDiv As Object, objH3 As Object 
Dim start_time As Date 
Dim end_time As Date 
lastRow = Range("A" & Rows.Count).End(xlUp).Row 
Dim cookie As String 
Dim result_cookie As String 
start_time = Time 
Debug.Print "start_time:" & start_time 

For i = 2 To lastRow 

    url = "https://www.google.co.in/search?q=" & Cells(i, 1) & "&rnd=" & WorksheetFunction.RandBetween(1, 10000) 

    Set XMLHTTP = CreateObject("MSXML2.serverXMLHTTP") 
    XMLHTTP.Open "GET", url, False 
    XMLHTTP.setRequestHeader "Content-Type", "text/xml" 
    XMLHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0" 
    XMLHTTP.send 

    Set html = CreateObject("htmlfile") 
    html.body.innerHTML = XMLHTTP.ResponseText 
    Set objResultDiv = html.getElementById("rhs_block")(0) 
    Set objH3 = objResultDiv.getElementsByTagName("div")(7).getElementsByTagName("a")(2).getElementsByTagName("span")(0).innerHTML 
    Cells(i, 2) = objH3 
    DoEvents 
Next 

    end_time = Time 
    Debug.Print "end_time:" & end_time 
    Debug.Print "done" & "Time taken : " & DateDiff("n", start_time, end_time) 
    MsgBox "done" & "Time taken : " & DateDiff("n", start_time, end_time) 
End Sub 

enter image description here

+0

Итак, вы проверили и по крайней мере 8 DIV внутри элемента hte с идентификатором ** rhs_block **, а внутри восьмого DIV есть как минимум 3 As и внутри третьего A есть хотя бы один SPAN, и этот диапазон имеет текст. Верный? – Jeeped

+0

'getElementById' не возвращает коллекцию. Он должен возвращать только один элемент. Вам не нужно '(0)'. – Jeeped

+0

Получаете ли вы ошибку времени выполнения 424 или 91? – blckbird

ответ

0

Элемент идентификаторы на HTML страницы должны быть уникальными (в противном случае она не будет "идентификатор"). Поэтому один идентификатор должен быть прикреплен только к одному элементу. Однако браузер не проверяет это, уважающе игнорирует эту ошибку в html-файле.

В любом случае, для вашей функции javascript getElementById() это означает, что она вернет только один элемент. Вам нужно изменить:

Set objResultDiv = html.getElementById("rhs_block")(0) 

Для

Set objResultDiv = html.getElementById("rhs_block") 

Тогда ваш objResultDiv больше не бросать ошибки во время выполнения 91.

Кстати, есть JavaScript функции, которые делают возвращают массив элементов , Например, getElementsByTagName("p") (возвращает все элементы с тегом абзаца) или getElementsByName("test123") (возвращает все элементы с name="test123").

С помощью имени функции вы можете указать, возвращается ли один или несколько элементов. (getElementById vs. getElement s ByName)

+0

Да, я понял. спасибо – user2269164

+0

@ user2269164 Если это вам помогло, пожалуйста, поддержите и принимайте в качестве ответа. – blckbird

Смежные вопросы