【问题标题】:VBA Macro, type mismatch errorVBA 宏,类型不匹配错误
【发布时间】:2017-12-11 09:08:46
【问题描述】:

我正在尝试在 excel 中获取 JSON 数据并对其进行解析。但是,我收到一个错误:类型不匹配。

有谁知道我该如何解决这个问题?我无法弄清楚我做错了什么。

这是我正在使用的 API 的链接:https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD

代码如下:

Public Sub exceljson()

    Dim https As Object, JSON As Object, i As Integer

    Set https = CreateObject("MSXML2.XMLHTTP")

    https.Open "GET", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD", False
    https.Send

    Set JSON = ParseJson(https.responseText)
    i = 2

    For Each Item In JSON
        Sheets(1).Cells(i, 1).Value = Item("USD")
        i = i + 1
    Next

    MsgBox ("complete")

End Sub

【问题讨论】:

  • 哪一行抛出类型不匹配?在 https.open 行上设置断点 (F9),然后使用 F8 键单步执行。
  • fyi,我只是在末尾添加了一个 S:XMLHTTP --> XMLHTTPS;现在错误提示:Active X 组件无法创建对象
  • 试试Debug.Print Item, JSON(Item)
  • 这些错误发生在哪一行上?

标签: vba excel


【解决方案1】:

如果您确认已正确导入JsonConverter 模块和Dictionary 类并引用Microsoft Scripting Runtime,则以下代码将起作用:

    Public Sub exceljson()
    Dim https As Object, Json As Object, i As Integer

    Dim Item As Variant

    Set https = CreateObject("MSXML2.XMLHTTP")
    https.Open "GET", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD", False
    https.Send

    Set Json = JsonConverter.ParseJson(https.responseText)

    i = 2
    For Each Item In Json.Items
        Sheets(1).Cells(i, 1).Value = Item
        i = i + 1
    Next
    MsgBox ("complete")
End Sub

希望对你有帮助!


更新

你应该分析服务器响应的Json数据,“Data”的值是一个Dictionary。所以你应该在For Each Loop中使用字典。

以下代码将获取所有数据,我只是以“高”键为例。您可以轻松地将其他键输出到 excel 中。

Public Sub exceljson()
    Dim https As Object, Json As Object, DataItem As Dictionary, i As Integer


    Set https = CreateObject("MSXML2.XMLHTTP")
    https.Open "GET", "https://min-api.cryptocompare.com/data/histominute?fsym=BTC&tsym=USD&limit=60&aggregate=3&e=CCCAGG", False
    https.Send

    'Use this debug command to see the whole response text
    'Debug.Print https.responseText
    Set Json = JsonConverter.ParseJson(https.responseText)


    i = 2
    For Each DataItem In Json("Data")
        'Use "high" as example, you can output other key/values
        Sheets(1).Cells(i, 1).Value = DataItem("high")

        i = i + 1
    Next
    MsgBox ("complete")
End Sub

【讨论】:

  • 嘿菲尔,这太完美了。有效。但是你能解释一下它的逻辑吗?我正在尝试将其应用到以下 URL,但它给了我第一行,但我试图仅获取特定值。 min-api.cryptocompare.com/data/…
  • 谢谢菲尔。除了在代码中定义我的 URL 之外,我如何要求它查看 Sheet2 中的一系列 URL 并通过它获取数据?
  • 如您所见,每个URL可能都需要您查看Json结构,因此我认为您必须一一进行。您可能需要几个 Sub 过程来执行此操作。在 VBA 中从 sheet2 获取输入非常容易,我认为您可以做到。
猜你喜欢
  • 2018-08-11
  • 2014-11-02
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 2017-04-14
相关资源
最近更新 更多