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

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表格。步骤如下:

  1. 打开Yahoo Finance的目标页面,按F12打开开发者工具,切换到「网络」标签页,刷新页面,找到加载数据的XHR请求(通常是包含statistics或quote字样的请求,返回JSON格式)。
  2. 复制该API的请求URL和必要的请求头(比如User-Agent,不然Yahoo会拒绝非浏览器的请求)。
  3. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:13:21