在Excel表中添加更多行时收到运行时错误91

时间:2019-01-13 15:16:48

标签: excel vba runtime-error

尊敬的堆栈溢出社区

运行简单的Excel表时,下面的代码可以正常工作。但是,当将该表显着扩展到几千行时,我不断收到代码的“运行时错误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 :(得分:1)

您在此行中设置了变量的事实:

this->Set()

不一定意味着Set var1 = html.getElementById("resultStats") 实际上不是var1。 实际上,这取决于您的链接。

在循环中,您将创建指向请求的链接,如下所示:

Nothing

...并将其用于XMLHTTP请求:

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.Open "GET", url, False
XMLHTTP.send

...等等,当您尝试运行下一行时:

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

...您得到Cells(i, 7).Value = var1.innerText ,因为您尝试获取NullReferenceException的{​​{1}}。

为了防止此类问题,您应该测试变量是否为空,然后再执行您打算做的事情:

.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。因此,在对这些对象做任何想做的事情之前,总是先测试代码是否为空