Excel宏仅执行到第60行,然后失败

时间:2019-06-12 14:38:22

标签: html excel vba get

我修改了在网上找到的代码,以便能够在HTML页面上找到ClassName并在执行Google搜索时返回其文本。我需要为大约10,000家公司执行此操作,但是当仅用100行对其进行测试时,它会起作用,然后在第60行左右停止。之后,我无法获得任何结果,发现解决该问题的唯一方法是等待大约一个小时,然后再次执行它。我在另一台计算机上对此进行了测试,结果和问题相同。它与第60行中的内容无关,因为每次测试我使用一组不同的100家公司。即使将循环的i = 2更改为101,仍然会导致同样的问题。

Col A的公司名称为:“ Buchart Horn”

Col B返回“马里兰州巴尔的摩的建筑师”

Col C为空白(很好)

C D返回“马里兰州巴尔的摩-Buchart Horn:工程师,建筑师和规划师”

我对VBA还是很陌生,因此可以提供任何帮助。谢谢。

'References enabled: 
'Microsoft Internet Controls, Microsoft HTML Object Library

Sub GoogleSearch()
Dim URL As String
Dim objHTTP As Object
Dim htmlDoc As HTMLDocument

Set htmlDoc = CreateObject("htmlfile")

Dim objResults1 As Object
Dim objResults2 As Object
Dim objResults3 As Object

On Error Resume Next

lastRow = Range("A" & Rows.count).End(xlUp).Row

For I = 2 To lastRow

URL = "https://www.google.com/search?q=" & Cells(I, 1)

Set objHTTP = CreateObject("MSXML2.XMLHTTP")

With objHTTP
.Open "GET", URL, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.send
htmlDoc.body.innerHTML = .responseText

End With

Set objResults1 = htmlDoc.getElementsByClassName("YhemCb")
Set objResults2 = htmlDoc.getElementsByClassName("wwUB2c kno-fb-ctx")
Set objResults3 = htmlDoc.getElementsByClassName("LC20lb")

Cells(I, 2) = objResults1(0).innerText
Cells(I, 3) = objResults2(0).innerText
Cells(I, 4) = objResults3(0).innerText

Next

Set htmlDoc = Nothing
Set objResults1 = Nothing
Set objResults2 = Nothing
Set objResults3 = Nothing
Set objHTTP = Nothing

End Sub

1 个答案:

答案 0 :(得分:0)

这里的问题是,在For循环中使用以下GET请求无法快速地向Google发送过多请求:

With objHTTP
.Open "GET", URL, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.send
htmlDoc.body.innerHTML = .responseText

End With

为了使此代码请求的发送速度符合我们所要求的服务器的要求,我们在循环中添加了一个暂停。

在VBA中最简单的内置暂停方式是:

For I = 2 To lastRow
... 'Lines omitted for clarity of purpose
...
Application.Wait (Now + TimeValue("0:00:6"))
Next

然后,应用程序将等到该时间继续执行(此方法的不幸限制是最小等待时间为1秒,因此较小的值将需要不同的解决方案Application.Wait和示例,它们可能会产生较小的延迟Here概述)