Excel 2019中VBA QueryTables无法抓取Yahoo Finance数据的问题求助
解决Excel QueryTable无法抓取Yahoo Finance数据的问题
我之前也踩过Yahoo Finance这个坑!你的代码在其他静态网站能正常运行,但在Yahoo这里失效,核心原因是Yahoo Finance现在的页面是动态渲染的——你用QueryTable抓取的是服务器返回的原始静态HTML,而页面上的那些表格数据是浏览器加载页面后,通过JavaScript调用后端API动态生成的,静态HTML里根本没有这些表格内容,所以QueryTable自然会提示“没有返回数据”。
下面给你两种可行的解决方案:
方案一:改用Power Query(推荐,更简单稳定)
Power Query能更好地处理动态网页内容,甚至可以直接识别Yahoo Finance加载后的表格数据。步骤如下:
- 打开Excel,点击「数据」选项卡 → 「获取数据」→ 「从其他来源」→ 「从Web」
- 输入目标URL:
https://finance.yahoo.com/quote/MSFT/key-statistics?p=MSFT,点击确定 - 在Power Query编辑器中,Yahoo的表格会被自动识别出来(Power Query会模拟浏览器执行部分JS逻辑加载数据),你可以选择需要的表格,然后点击「关闭并上载」就能把数据导入到Excel里。
- 如果需要自动化,可以把这个操作录制为宏,或者直接用Power Query的M语言编写脚本。
方案二:用VBA结合API请求解析JSON
如果坚持用VBA,你需要直接调用Yahoo Finance的后端API获取JSON数据,再解析成Excel表格。步骤如下:
- 打开Yahoo Finance的目标页面,按F12打开开发者工具,切换到「网络」标签页,刷新页面,找到加载数据的XHR请求(通常是包含
statistics或quote字样的请求,返回JSON格式)。 - 复制该API的请求URL和必要的请求头(比如
User-Agent,不然Yahoo会拒绝非浏览器的请求)。 - 在VBA中用
XMLHTTP发送请求获取JSON数据,再用JSON解析库(比如VBA-JSON)把JSON转换成表格。
示例代码(需先导入VBA-JSON库):
Sub ImportYahooStats() Dim ws As Worksheet Dim xmlHttp As Object Dim jsonResp As Object Dim statsData As Variant Dim i As Integer Set ws = ThisWorkbook.Worksheets.Add Set xmlHttp = CreateObject("MSXML2.XMLHTTP.6.0") ' 替换为你找到的API请求地址 Dim apiUrl As String apiUrl = "https://query1.finance.yahoo.com/v10/finance/quoteSummary/MSFT?modules=defaultKeyStatistics" With xmlHttp .Open "GET", apiUrl, False ' 模拟浏览器请求头,避免被拦截 .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" .send End With ' 解析JSON数据 Set jsonResp = JsonConverter.ParseJson(xmlHttp.responseText) Set statsData = jsonResp("quoteSummary")("result")(1)("defaultKeyStatistics") ' 将数据写入Excel表格 i = 1 For Each key In statsData.Keys ws.Cells(i, 1).Value = key ws.Cells(i, 2).Value = statsData(key)("raw") ' 提取原始数值 i = i + 1 Next key End Sub
补充:为什么原代码失效?
再啰嗦两句:QueryTable的工作逻辑是直接抓取网页的静态HTML内容,然后从中提取表格。但现在大部分现代网站(包括Yahoo Finance)都采用了前后端分离架构,页面的核心数据是通过AJAX异步加载的,静态HTML里只有页面框架,没有实际的表格数据,所以QueryTable找不到任何表格,就会弹出那个错误提示。
内容的提问来源于stack exchange,提问作者Walhaff
相关产品推荐
相关产品推荐

