首页 > 解决方案 > 大量行后 Excel VBA 崩溃

问题描述

我创建了一个 Excel 宏来对更大的数据集(约 24,000 行)运行分析。该宏在第一个 c 中运行良好。2,000 个请求/行,但此后通常会崩溃。因此,发生崩溃的请求/行号会有所不同。

此时出现的调试器突出显示导致崩溃的代码行是:

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

我已经检查了有关此主题的其他线程和解决方案,包括从“Int”到“Long”的建议更改等 - 但是这些都不起作用。任何人都可以帮助为什么宏对较小的请求运行良好但在一定数量的行后失败?

我正在使用的代码粘贴在下面。提前谢谢了。

Sub Gethits()
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, 4) & "&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

标签: excelvbacrash

解决方案


感谢您的反馈意见。该限制确实似乎是由谷歌限制给定时间段内的请求数量所驱动的。发生错误后访问 Google 网页时,由于请求活动异常高,我被要求通过验证码进程运行。

在任何情况下,一次提交多个请求的想法似乎都非常有趣,因为它可以节省大量收集数据的时间。但是,TinMan (codereview.stackexchange.com/a/196922/171419) 是否有简化示例的方法?我已经检查了其他线程,但到目前为止还没有发现任何有用的东西。


推荐阅读