Excel VBA:加快自定义项从网页获取数据

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 = .

我的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
这是在提取库存数据,而且工作正常,但是当进行几百个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
有没有更有效(更快)的方法

我试着将页面存储在某种缓存中。我试图将页面推送到数组中,但无法编写正确的代码来获取和使用该数组中的页面

阵列应具有两个维度:

  • id(使用股票行情器查询的页面)
  • 名称、价格、测试版等
  • 我知道这不是很具体,但我做了很多研究,无法进一步推进,所以也许有人可以指出一些方向或提出解决方案


    提前感谢。

    您的作业说明是错误的,因为
    oHTML
    是一个
    新的
    HTML文档,根本没有
    myClass之类的元素
    ,直到您阅读了
    .responseText
    或使用其他方法检索页面的HTML内容。此代码实际上看起来非常精简。。。你可以考虑<代码>设置OHTML= NOT/<代码> >代码>结束子< /C>。但是VBA应该是垃圾收集的(应该是),所以我不确定这是否会对你有很大帮助。还有几件事需要考虑:这段代码是从另一个子例程调用的,这可能是罪魁祸首。或者“慢度”可能是循环的一个函数(显然,对这个函数的300个调用应该比对同一个函数的4个调用要长)。也许自动化IE(而不是
    CreateObject(WinHTTP…
    )可能更快——我不确定——但可能值得测试一下。我不会为此使用UDF——通过HTTP获取数据的开销很高,所以您会很快陷入困境。最好让一个子系统“按需”运行刷新(例如,通过点击按钮)。如果必须使用UDF,请考虑某种形式的数据缓存:当您获得id=x的响应时,将其存储在本地(例如,在字典/集合中加上时间戳),然后在使用相同输入再次调用函数时返回该值(如果响应对时间敏感,则可以选择在特定时间段内返回).也许你可以用一个更完整的例子来更新你的问题。您从UDF返回单元格的具体内容是什么?当然,您不需要存储整个页面来缓存该值?