Ошибка выполнения 91 при добавлении дополнительных строк в таблицу Excel - PullRequest
0 голосов
/ 13 января 2019

Уважаемое сообщество переполнения стека,

При работе с простой таблицей Excel приведенный ниже код работает без проблем. Однако при значительном расширении таблицы до нескольких 1000 строк я продолжаю получать «Ошибка выполнения 91» для кода, отмечая, что переменная объекта не была установлена ​​для Cells(i, 7).Value = var1.innerText.

Однако я установил переменную в предыдущей строке (Set var1 = html.getElementById("resultStats")). Видите ли вы, почему эта ошибка продолжает возникать, хотя переменная была установлена?

Я уже проверил обычные страницы устранения неполадок (https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/object-variable-not-set-error-91 и т. Д.), Из которых ни одна не может помочь.

Большое спасибо за вашу помощь.

Option Explicit

Sub TermCount()
Dim url As String, lastRow As Long
Dim XMLHTTP As Object, html As Object, objResultDiv As Object, objH3 As Object, link As Object
Dim start_time As Date
Dim end_time As Date
Dim var As String
Dim var1 As Object

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 = 1654 To lastRow

    url = "https://www.google.com/search?q=" & Cells(i, 1) & "&source=lnt&tbs=cdr%3A1%2Ccd_min%3A" & Cells(i, 5) & "%2Ccd_max%3A" & Cells(i, 6) & "&tbm=nws"

    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("rso")
    Set var1 = html.getElementById("resultStats")
    Cells(i, 7).Value = var1.innerText

    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

1 Ответ

0 голосов
/ 13 января 2019

Тот факт, что вы задали переменную с помощью этой строки:

Set var1 = html.getElementById("resultStats")

не обязательно означает, что var1 на самом деле не Nothing. На самом деле это зависит от вашей ссылки.

В своем цикле вы создаете ссылку на ваш запрос следующим образом:

url = "https://www.google.com/search?q=" & Cells(i, 1) & "&source=lnt&tbs=cdr%3A1%2Ccd_min%3A" & Cells(i, 5) & "%2Ccd_max%3A" & Cells(i, 6) & "&tbm=nws"

... и использовать его в запросе XMLHTTP:

XMLHTTP.Open "GET", url, False
XMLHTTP.send

... который может или не может вернуть желаемый результат. В случае, если вы получаете ошибку, скорее всего, у вас есть:

Set var1 = html.getElementById("resultStats")
>>> var1 = Nothing

... и так, при попытке запустить следующую строку:

Cells(i, 7).Value = var1.innerText

... вы получаете NullReferenceException, потому что вы пытаетесь взять .innerText из Nothing.

Чтобы предотвратить этот тип проблемы, вы должны проверить вашу переменную на нулевое значение и только затем делать то, что вы должны делать:

Set var1 = html.getElementById("resultStats")
If Not var1 Is Nothing Then
    Cells(i, 7).Value = var1.innerText
    '... and whatever else you want to do with var1
End If

Примечание: в более общем смысле, это то, что вы всегда должны делать в своем коде, когда есть риск для недействительности. Например:

  • Set var1 = Range("A1"). Здесь нет риска, на листе всегда будет Range("A1"), поэтому var1 не может быть Nothing.
  • Set var1 = Range("A1:A100").Find("something that doesn't exist"). В этом случае может быть риск того, что Find вернет Nothing, если искомого значения не существует. Следовательно, вы всегда должны проверять var1 на ничтожность, чтобы избежать ссылки на что-либо на объекте Nothing.

Когда вы работаете с XMLHTTP запросами, вы потенциально никогда не узнаете , является ли объект, возвращаемый из запроса, чем-то или является Nothing. Следовательно, всегда проверяет ваш код на ничтожность, прежде чем делать то, что вы хотите сделать с этими объектами .

...