
本文详解如何绕过动态渲染障碍,直接调用巴西央行官方API接口,使用VBA精准抓取实时买入汇率值(如“5,2037”),避免因网页DOM异步加载导致的getElementsByTagName失效问题。
本文详解如何绕过动态渲染障碍,直接调用巴西央行官方api接口,使用vba精准抓取实时买入汇率值(如“5,2037”),避免因网页dom异步加载导致的`getelementsbytagname`失效问题。
巴西央行官网(https://www.php.cn/link/c9eb4f731030f8ba5f7bbf6dfdac7948)首页展示的汇率数据(如美元兑雷亚尔买入价)并非静态HTML内容,而是由前端JavaScript通过AJAX异步请求外部API(/api/servico/sitebcb/indicadorCambio)动态注入的。因此,使用传统XMLHTTP60 + HTMLDocument方式直接请求主页面HTML,无法获取该数据——响应中仅包含空占位符或初始骨架结构,真实数值尚未加载。
✅ 正确做法是:跳过渲染层,直连数据源API。该API返回标准JSON格式响应,结构清晰、稳定可靠,且无需模拟浏览器行为或等待DOM就绪。
以下为推荐的VBA实现方案(兼容Excel 365 / 2019+,无需额外引用):
Sub GrabBCBExchangeRate()
Const API_URL As String = "https://www.php.cn/link/c9eb4f731030f8ba5f7bbf6dfdac7948api/servico/sitebcb/indicadorCambio"
Dim http As Object, ws As Worksheet
Dim jsonResponse As String, regex As Object, matches As Object
Set ws = ThisWorkbook.Worksheets("Sheet1")
Set http = CreateObject("MSXML2.XMLHTTP")
Set regex = CreateObject("VBScript.RegExp")
' 发起GET请求
With http
.Open "GET", API_URL, False
.setRequestHeader "Accept", "application/json, text/plain, */*"
.send
If .Status 200 Then
MsgBox "API请求失败,状态码:" & .Status & vbCrLf & .StatusText, vbExclamation
Exit Sub
End If
jsonResponse = .responseText
End With
' 使用正则提取"valorCompra"字段值(更轻量,兼容无JSON解析库环境)
With regex
.Global = False
.MultiLine = True
.Pattern = """valorCompra""\s*:\s*""([^""]+)"""
End With
Set matches = regex.Execute(jsonResponse)
If matches.Count > 0 Then
ws.Cells(1, 1).Value = matches(0).SubMatches(0) ' 写入A1单元格
ws.Cells(1, 1).NumberFormatLocal = "@" ' 保持字符串格式(保留逗号小数点)
Else
ws.Cells(1, 1).Value = "未找到汇率值"
End If
End Sub
? 关键说明与注意事项:
-
不依赖IE或Edge控件:全程使用轻量
MSXML2.XMLHTTP,执行快、稳定性高,无浏览器兼容性风险; -
正则替代JSON解析:因VBA原生不支持JSON对象(需第三方库如
VBA-JSON),此处用正则安全提取字段值(匹配"valorCompra":"5,2037"中的数字字符串),简洁可靠; -
格式保留:巴西使用逗号作小数点(如
5,2037),建议将单元格设为文本格式(NumberFormatLocal = "@"),避免Excel自动转为日期或数值; - 错误防护:检查HTTP状态码,避免网络异常导致静默失败;
-
API稳定性:该端点为BCB官方公开服务,长期可用,但建议在生产环境中添加重试机制与超时设置(
.setTimeouts 5000, 5000, 5000, 5000)。
? 进阶提示:若需解析完整JSON结构(如同时获取卖出价、币种、时间戳),可引入开源库 VBA-JSON,将jsonResponse解析为Dictionary对象,实现更健壮的数据映射。
此方法本质是“面向接口编程”,摒弃对不可控前端渲染的依赖,直击数据源头——这才是自动化采集现代单页应用(SPA)数据的正确范式。










