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 调用。