尊敬的堆栈溢出社区
运行简单的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
答案 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
。因此,在对这些对象做任何想做的事情之前,总是先测试代码是否为空。