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
相关产品推荐
相关产品推荐

