You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA新手求助:如何提取ANBIMA网页表格中的指定数值?

从ANBIMA网站提取指定数值的VBA优化方案

需要从ANBIMA指标页面的表格中提取最后一列的6.869,14和0,35两个数值。作为VBA新手,尝试了Stack Overflow上《Extract table from webpage using VBA》里的方案均无效,自己写了一段可行但不够高效优雅的代码:

Sub scrape_quotes()
   Dim browser As InternetExplorer
   Dim page As HTMLDocument
   
   Set browser = New InternetExplorer
   browser.Visible = False
   browser.navigate ("https://www.anbima.com.br/informacoes/indicadores/")
   Do While browser.Busy: Loop
   Set page = browser.document
'-----
    Dim spanElement As Object, buttonElement As Object
 
    Set spanElement = page.getElementsByClassName("linhadados")

    aux = spanElement.Length
    
    For i = 0 To spanElement.Length - 1
        If VBA.Left(spanElement.Item(i).innerText, 5) = "IPCA " Then aux_indice = CDbl(VBA.Right(spanElement.Item(i).innerText, 8))
        If VBA.Left(spanElement.Item(i).innerText, 5) = "IPCA1" Then aux_proj = CDbl(VBA.Right(spanElement.Item(i).innerText, 4))
        
    Next i
    browser.Quit
End Sub

另外@W_O_L_F提供的方案在执行objHTTP.send时出错,求更合适的解决方案。


优化后的VBA方案(高效且可靠)

下面的方案用XMLHTTP替代InternetExplorer,无需打开浏览器,速度更快;同时通过拆分文本而非固定长度截取获取数值,避免页面文本格式变化导致的错误,还处理了巴西本地化数字格式的转换:

Sub ExtractANBIMAVals()
    Dim xmlHttp As Object
    Dim htmlDoc As Object
    Dim rowElements As Object
    Dim row As Object
    Dim textParts As Variant
    Dim ipcaVal As Double, ipca1Val As Double
    
    ' 创建XMLHTTP对象
    Set xmlHttp = CreateObject("MSXML2.XMLHTTP.6.0")
    xmlHttp.Open "GET", "https://www.anbima.com.br/informacoes/indicadores/", False
    xmlHttp.send
    
    ' 解析HTML内容
    Set htmlDoc = CreateObject("HTMLFile")
    htmlDoc.body.innerHTML = xmlHttp.responseText
    
    ' 获取目标行元素集合
    Set rowElements = htmlDoc.getElementsByClassName("linhadados")
    
    ' 遍历行元素匹配目标内容
    For Each row In rowElements
        textParts = Split(Trim(row.innerText), " ")
        ' 匹配IPCA行,取最后一段数值
        If UBound(textParts) >= 0 And textParts(0) = "IPCA" Then
            ipcaVal = CDbl(Replace(Replace(textParts(UBound(textParts)), ".", ""), ",", "."))
        ' 匹配IPCA1行,取最后一段数值
        ElseIf UBound(textParts) >= 0 And textParts(0) = "IPCA1" Then
            ipca1Val = CDbl(Replace(Replace(textParts(UBound(textParts)), ".", ""), ",", "."))
        End If
    Next row
    
    ' 输出结果(可替换为写入单元格等操作)
    Debug.Print "IPCA数值: " & ipcaVal
    Debug.Print "IPCA1数值: " & ipca1Val
    
    ' 释放对象
    Set xmlHttp = Nothing
    Set htmlDoc = Nothing
    Set rowElements = Nothing
End Sub

方案说明

  • 效率提升:用XMLHTTP直接请求页面内容,无需启动IE浏览器,执行速度大幅提升
  • 可靠性增强:通过拆分文本取最后部分获取数值,避免原代码固定长度截取的局限性(页面文本长度变化时不会出错)
  • 格式兼容:处理巴西本地化数字格式(千位用.、小数用,),转换为VBA可识别的标准格式
  • 可扩展性:可根据需求添加错误捕获逻辑,避免页面结构变化导致程序崩溃

内容的提问来源于stack exchange,提问作者Osvaldo Assunção

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 11:53:12