VBA - ParseJson(http.responsetext)返回“错误13:类型不匹配”

时间:2017-05-14 21:14:00

标签: vba

我正在开发一个从API获取数据的项目。 我的测试很好。

在我高于14之后,它开始出现错误13类型不匹配并停止

有人可以帮我解释为什么我有错误

  

如果json(" meta")(" total")是"键入不兼容性"

我跑了我的maccro很多次,现在它跑到i = 103才得到错误。

我将下面使用的代码放在下面,以便您可能会看到一些改进错误以及我收到错误的原因。

提前感谢您的帮助。

Sub Test()
    'create object to receive datas
    Dim http As Object, json As Object
    Set http = CreateObject("MSXML2.XMLHTTP")

    'process the data
    i = 1
    k = 2
    While i <= 200
        Dim j As String
        j = i
        Dim url As String
        url = "https://api.worldoftanks.eu/wot/encyclopedia/vehicles/?application_id=demo&tank_id=" & i
        http.Open "GET", url, False
        http.send
        Set json = ParseJson(http.responsetext)

        If json("meta")("total") <> null Then
            ' Tank id
            Sheets(2).Cells(k, 1).Value = json("data")(j)("tank_id")
            ' Tank is premium or Standard
            If json("data")(j)("is_premium") = False Then
                Sheets(2).Cells(k, 2).Value = "Standard"
                Else: Sheets(2).Cells(k, 2).Value = "Premium"
            End If
            ' Tank name
            Sheets(2).Cells(k, 3).Value = json("data")(j)("name")
            ' Tank nation
            Sheets(2).Cells(k, 4).Value = json("data")(j)("nation")
            ' Tank best Radio
            Dim radios As Integer
            radios = 0
            For Each Item In json("data")(j)("radios")
                If Item > radios Then radios = Item Else radios = radios
            Next Item
            Sheets(2).Cells(k, 5).Value = radios
            ' End of Tank Values, next
            i = i + 1
            k = k + 1
        Else: i = i + 1
        End If
    Wend

    MsgBox ("complete")
End Sub

[编辑] 我尝试了&#34;接下来的错误恢复&#34;公式那样

While i <= 100
    j = i
    Dim url As String
    url = myurl & i
    http.Open "GET", url, False
    http.send
    Set response = ParseJson(http.responsetext)

    On Error Resume Next

    If IsNull(response("meta")("total")) Then
    Else:
        ' Tank id
        Sheets(1).Cells(k, 1).Value = response("data")(j)("tank_id")
        ' Tank is premium or Standard
        If response("data")(j)("is_premium") = False Then
            Sheets(1).Cells(k, 2).Value = "Standard"
            Else: Sheets(1).Cells(k, 2).Value = "Premium"
        End If
        ' Tank name
        Sheets(1).Cells(k, 3).Value = response("data")(j)("name")
        ' Tank nation
        Sheets(1).Cells(k, 4).Value = response("data")(j)("nation")
        ' Tank best Radio
        Dim radios As Integer
        radios = 0
        For Each Item In response("data")(j)("radios")
            If Item > radios Then radios = Item Else radios = radios
        Next Item
        Sheets(1).Cells(k, 5).Value = radios
        ' End of Tank Values, next
        k = k + 1
    End If
    i = i + 1
Wend

现在错误没有显示,但工作表中也没有写入任何内容。 有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

来自MSDN documentation

  

在某些情况下(例如If Var = NullIf Var <> Null,您可能希望评估为 True 的表达式始终为 False 。这是因为任何包含 Null 的表达式本身都是 Null ,因此 False

测试非Null的正确方法是

If Not IsNull(json("meta")("total")) Then

仅当json返回实际Variant/Null值时才会有效。

如果它只返回零长度字符串,您应该使用:

If json("meta")("total") <> vbNullString Then

如果它返回Variant/Empty,您应该使用:

If Not IsEmpty(json("meta")("total")) Then

注意:这并不能解释为什么会出现“类型不兼容”错误,也不能解释为什么每次运行代码时它都不会在同一次迭代中崩溃。它只是解释了为什么If语句中没有任何内容正在处理中。