VBA - Excel 中显示的 API 调用

Posted

技术标签:

【中文标题】VBA - Excel 中显示的 API 调用【英文标题】:VBA - API call displayed in Excel 【发布时间】:2018-07-28 20:58:45 【问题描述】:

我试图在 Excel 表格中显示特定加密货币的价格。我正在从 CoinMarketCap 的 API 中提取 JSON 数据 - https://api.coinmarketcap.com/v1/ticker/

最终,我试图获取 Ripple 的价格(第 16 行),然后在我的 Excel 工作表中设置单元格 B1 以显示 Ripple 的价格(第 17 行)。

这是我的脚本,但由于某种原因无法正常工作。

Sub test()

Dim httpObject As Object
Set httpObject = CreateObject("MSXML2.XMLHTTP")

sURL = "https://api.coinmarketcap.com/v1/ticker/"

sRequest = sURL
httpObject.Open "GET", sRequest, False
httpObject.Send
sGetResult = httpObject.ResponseText

Dim oJSON As Object
Set oJSON = JsonConverter.ParseJson(sGetResult)

  If oJSON.Name = "Ripple" Then
  B1 = oJSON("Ripple")("price_usd")

End If
End Sub

API 调用成功(我相信),但出现语法错误等。希望有人能够提供帮助。提前致谢

编辑:这是 Microsoft Excel 2010

编辑 2: 是第 16 行和第 17 行(分别是 If oJSON.Name...B1 = oJSON(... 提出了问题,但到目前为止我一直无法解决它/找到错误。请参阅运行时错误等的 cmets。

编辑 3:我相信我在第 16 行和第 17 行中通过引用 oJSON 而不是项目 (sItem) 犯了一个错误。但是,即使更改此设置(例如If sItem.Name = "Ripple" Then...),它仍然无法正常工作。

编辑 4:我相信我也以错误的方式标记了 excel 单元格。我现在不是简单地写B1 = ...,而是写Range.("B1").Value = ...,它在测试中有效。

【问题讨论】:

请详细说明错误?描述是什么?它们出现在哪一行? 您能否检查响应或写出以便显示相关的 JSON...? @QHarr “运行时错误 '438':对象不支持此属性或方法。”当我尝试提取值时,发生在第 16 行和/或第 17 行。 这就是你说 If oJSON......? 要检索price_usd for ripple id,您应该遍历每个对象,找到具有ripple id 的对象并获取price_usd 值。 【参考方案1】:

@omegastripes 建议的这种修改在这里有效。 json对象是字典的集合,所以需要这样对待。

Dim oJSON As Object
Set oJSON = JsonConverter.ParseJson(sGetResult)

Dim V As Object
For Each V In oJSON
    If V("name") = "Ripple" Then
        Cells(1, 2) = V("price_usd")
        Exit For
    End If
Next V

【讨论】:

非常感谢,非常感谢!【参考方案2】:

看看下面的例子。 将JSON.bas模块导入VBA项目进行JSON处理。

Option Explicit

Sub Test48852376()

    Dim sJSONString As String
    Dim vJSON As Variant
    Dim sState As String
    Dim vElement As Variant
    Dim sValue As String
    Dim aData()
    Dim aHeader()

    ' Retrieve JSON string
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://api.coinmarketcap.com/v1/ticker/", False
        .Send
        sJSONString = .responseText
    End With
    ' Parse JSON
    JSON.Parse sJSONString, vJSON, sState
    If sState = "Error" Then MsgBox "Invalid JSON string": Exit Sub
    ' Extract ripple price_usd
    Do
        For Each vElement In vJSON
            Select Case False
                Case vElement.Exists("id")
                Case vElement("id") = "ripple"
                Case vElement.Exists("price_usd")
                Case Else
                    MsgBox "ripple price_usd " & vElement("price_usd")
                    Exit Do
            End Select
        Next
        MsgBox "ripple price_usd not found"
    Loop Until True
    ' Output the entire table to the worksheet
    JSON.ToArray vJSON, aData, aHeader
    With Sheets(1)
        .Cells.Delete
        .Cells.WrapText = False
        OutputArray .Cells(1, 1), aHeader
        Output2DArray .Cells(2, 1), aData
        .Columns.AutoFit
    End With
    MsgBox "Completed"

End Sub

Sub OutputArray(oDstRng As Range, aCells As Variant)

    With oDstRng
        .Parent.Select
        With .Resize(1, UBound(aCells) - LBound(aCells) + 1)
            .NumberFormat = "@"
            .Value = aCells
        End With
    End With

End Sub

Sub Output2DArray(oDstRng As Range, aCells As Variant)

    With oDstRng
        .Parent.Select
        With .Resize( _
                UBound(aCells, 1) - LBound(aCells, 1) + 1, _
                UBound(aCells, 2) - LBound(aCells, 2) + 1)
            .NumberFormat = "@"
            .Value = aCells
        End With
    End With

End Sub

我的输出如下:

顺便说一句,类似的方法适用于in other answers。

【讨论】:

非常感谢您提供详尽的示例以及对早期答案的引用。我非常感谢您的帮助。

以上是关于VBA - Excel 中显示的 API 调用的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBA 限制 Excel 中的地理定位 API 调用。

ExcelVBA如何调用API DLL(Delphi生成)

Excel-VBA - 在数据字段数组中插入新的第一列,无需循环或 API 调用

在访问 vba 的 excel 文件中未启用显示警报

在 Excel VBA 用户窗体中显示 PDF

谁会用vba查询一个log文件,然后将结果显示在excel上