我正在尝试将该宏从ie.application重写为VBA中的http请求。 宏会导航到URL,先获取html,然后解析并抓取所需的数据。
它可以很好地处理一个请求,但是当我尝试使用包含数千个URL的FOR循环来执行此操作时,Excel就会崩溃。
我认为我应该在进入下一个循环之前以某种方式“关闭”连接,但是我没有找到解决方案。
这是我的代码:
Sub GetQuotes()
Dim xmlhttp As New MSXML2.XMLHTTP60, myurl As String
Dim html As New HTMLDocument
For r = 1 To 10
'*****GO TO PRODUCT PAGE*****
path= ThisWorkbook.Worksheets("Sheet1").Cells(r, 1).Value
myurl = "https://some_domain.com" + path
xmlhttp.Open "GET", myurl, False
xmlhttp.send
html.body.innerHTML = xmlhttp.responseText
'*****GET PRICE*****
If Not html.getElementById("some_id") Is Nothing Then
price = html.getElementById("some_id").innerHTML
ThisWorkbook.Worksheets("sheet1").Cells(r, 2).Value = price
Else
price = "empty"
ThisWorkbook.Worksheets("sheet1").Cells(r, 2).Value = price
End If
Next r
End Sub
XML和HTML引用处于活动状态
答案 0 :(得分:0)
挤入
Do While xmlhttp.ReadyState <> 4
DoEvents
Loop
发送后。您当前的代码几乎会立即触发所有请求。这样,您将等待页面加载后再继续。
答案 1 :(得分:0)
这有效:
发送请求后立即在内部执行DoEvents。
仅在下一个r之前有一个DoEvent。
仅使用其中之一是无效的。