You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Excel VBA调用Robin Hood API解析股票报价遇编译错误求助

解决Robin Hood API VBA解析的编译错误问题

核心错误原因

你碰到的Compiler Error: Object Required问题,本质是变量类型不匹配

  • 你将results声明为String(值类型),但Robin Hood API返回的results是一个JSON数组,经过VBA-JSON解析后会变成Collection对象。对象类型的变量必须用Set赋值,且变量类型要和返回的对象类型一致,String根本无法接收对象,自然会报错。

而你尝试改成Object后出现的运行时错误,是因为Object类型无法直接被MsgBox输出(MsgBox只能处理字符串/数值等简单类型),需要先提取对象中的具体数据。


修正后的完整代码

下面是修复后的可运行代码,我还添加了请求状态检查、字段提取的逻辑,方便你直接获取亚马逊的报价数据:

Public Sub STOCKQUOTE()
    Dim http As Object
    Set http = CreateObject("MSXML2.XMLHTTP")
    
    Const sURL As String = "https://api.robinhood.com/quotes/?symbols=AMZN"
    http.Open "GET", sURL, False
    http.send
    
    ' 先检查API请求是否成功
    If http.Status <> 200 Then
        MsgBox "API请求失败,状态码:" & http.Status
        Exit Sub
    End If
    
    Dim jsonResponse As Dictionary
    Set jsonResponse = JsonConverter.ParseJson(http.responseText)
    
    ' 正确声明results为Collection类型(对应JSON数组)
    Dim results As Collection
    Set results = jsonResponse("results")
    
    ' 遍历results集合(即使只查一只股票,也是集合里的第一个元素)
    Dim stockData As Dictionary
    For Each stockData In results
        ' 提取你需要的报价字段(字段名对应API返回的JSON结构)
        Dim stockSymbol As String
        Dim lastTradePrice As Double
        Dim askPrice As Double
        
        stockSymbol = stockData("symbol")
        lastTradePrice = stockData("last_trade_price")
        askPrice = stockData("ask_price")
        
        ' 友好显示结果
        MsgBox "股票信息:" & vbCrLf & _
               "代码:" & stockSymbol & vbCrLf & _
               "最新成交价:$" & Format(lastTradePrice, "0.00") & vbCrLf & _
               "卖一价:$" & Format(askPrice, "0.00")
    Next stockData
End Sub

关键细节说明

  1. 变量类型匹配
    API返回的{"results": [ {...} ]}是JSON数组,VBA-JSON会把它解析为Collection对象,所以必须用Collection类型的变量接收,再用Set赋值。

  2. 遍历集合提取数据
    即使你只查询一只股票,results依然是一个包含单个元素的集合,用For Each遍历可以兼容多股票查询的场景(比如把URL改成symbols=AMZN,AAPL)。

  3. 字段对应关系
    你可以通过Debug.Print http.responseText打印完整的JSON响应,查看所有可用字段,比如bid_price(买一价)、volume(成交量)等,按需提取即可。

  4. 请求状态检查
    添加http.Status <> 200的判断,可以避免API返回错误(比如网络问题、符号错误)时继续解析无效的JSON,让代码更健壮。

内容的提问来源于stack exchange,提问作者OrdinaryHuman

火山引擎 最新活动