Excel VBA:加快自定义项从网页获取数据
我的UDF每次调用时都会从网页中提取数据 连接如下所示:Excel VBA:加快自定义项从网页获取数据,vba,excel,Vba,Excel,我的UDF每次调用时都会从网页中提取数据 连接如下所示: Public Sub myConnection(id) Set oHtml = New HTMLDocument With CreateObject("WINHTTP.WinHTTPRequest.5.1") .Open "GET", "http://www.example.com" & id, False .send oHtml.body.innerHTML = .
Public Sub myConnection(id)
Set oHtml = New HTMLDocument
With CreateObject("WINHTTP.WinHTTPRequest.5.1")
.Open "GET", "http://www.example.com" & id, False
.send
oHtml.body.innerHTML = .responseText
End With
End Sub
Function myFunction(id,element)
Call myConnection(id)
Select Case element
Case "p"
Set dados = oHtml.getElementsByClassName("thisClass")(0)
myFunction = dados.innerText
//etc...
End Select
End Function
这是在提取库存数据,而且工作正常,但是当进行几百个UDF调用时,工作簿会变得非常慢
我的功能是:
Public Sub myConnection(id)
Set oHtml = New HTMLDocument
With CreateObject("WINHTTP.WinHTTPRequest.5.1")
.Open "GET", "http://www.example.com" & id, False
.send
oHtml.body.innerHTML = .responseText
End With
End Sub
Function myFunction(id,element)
Call myConnection(id)
Select Case element
Case "p"
Set dados = oHtml.getElementsByClassName("thisClass")(0)
myFunction = dados.innerText
//etc...
End Select
End Function
有没有更有效(更快)的方法
我试着将页面存储在某种缓存中。我试图将页面推送到数组中,但无法编写正确的代码来获取和使用该数组中的页面
阵列应具有两个维度:
提前感谢。您的作业说明是错误的,因为
oHTML
是一个新的HTML文档,根本没有myClass之类的元素
,直到您阅读了.responseText
或使用其他方法检索页面的HTML内容。此代码实际上看起来非常精简。。。你可以考虑<代码>设置OHTML= NOT/<代码> >代码>结束子< /C>。但是VBA应该是垃圾收集的(应该是),所以我不确定这是否会对你有很大帮助。还有几件事需要考虑:这段代码是从另一个子例程调用的,这可能是罪魁祸首。或者“慢度”可能是循环的一个函数(显然,对这个函数的300个调用应该比对同一个函数的4个调用要长)。也许自动化IE(而不是CreateObject(WinHTTP…
)可能更快——我不确定——但可能值得测试一下。我不会为此使用UDF——通过HTTP获取数据的开销很高,所以您会很快陷入困境。最好让一个子系统“按需”运行刷新(例如,通过点击按钮)。如果必须使用UDF,请考虑某种形式的数据缓存:当您获得id=x的响应时,将其存储在本地(例如,在字典/集合中加上时间戳),然后在使用相同输入再次调用函数时返回该值(如果响应对时间敏感,则可以选择在特定时间段内返回).也许你可以用一个更完整的例子来更新你的问题。您从UDF返回单元格的具体内容是什么?当然,您不需要存储整个页面来缓存该值?