对象Vba读取项

对象Vba读取项,vba,excel,Vba,Excel,我无法读取电影对象,我不知道为什么??,我正在尝试将JSOn API返回到excel中的工作表中,但我无法读取电影对象 Sub getData() Dim Movie As Object Dim R As Object Dim scriptControl As Object Set scriptControl = CreateObject("MSScriptControl.ScriptControl") scriptControl.Language = "JScript" With Cre

我无法读取电影对象,我不知道为什么??,我正在尝试将JSOn API返回到excel中的工作表中,但我无法读取电影对象

Sub getData()

Dim Movie As Object
Dim R As Object
Dim scriptControl As Object

Set scriptControl = CreateObject("MSScriptControl.ScriptControl")
scriptControl.Language = "JScript"

With CreateObject("MSXML2.XMLHTTP")
    .Open "GET", "https://api.coinmarketcap.com/v1/ticker/shift/", False
    .send
    Set R = scriptControl.Eval("(" + .responsetext + ")")
    .abort
    With Sheets("API")
        For Each Movie In R
            MsgBox (Movie.Name)
            .Cells(1, 2).Value = Movie.price_btc
            .Cells(1, 3).Value = Movie.price_usd
            .Cells(1, 4).Value = Movie.Rank
        Next Movie
    End With
End With
端接头

我创建了一个名为API的表来返回值,但我不知道如何在Movie对象中检索值元素

您可以签入debug而不是包含数据的电影,但当我尝试将其放入单元格时,会发送一个错误:


您的问题是,如果javascript对象的某些属性的名称与VBA关键字或其他保留术语匹配,则无法在VBA中直接访问它们。name就是一个例子-如果案例没有切换到Movie.name,您将看到无法编写Movie.name

这里有一种使用javascript访问属性的方法,但是您最好使用VBAjson之类的工具,因为它提供了更好的多用途方法

Sub getData()

    Dim Movie As Object
    Dim R As Object
    Dim sc As Object, x

    Set sc = CreateObject("MSScriptControl.ScriptControl")
    sc.Language = "JScript"

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://api.coinmarketcap.com/v1/ticker/shift/", False
        .send
        sc.Eval ("var i, o = (" + .responsetext + ")")
        sc.Eval "function l(){return o.length;}"
        sc.Eval "function indx(n){i=n;}"
        sc.Eval "function p(pname){return o[i][pname];}"

        .abort

        With Sheets(1)
            For x = 1 To sc.Eval("l()")
                sc.Eval "indx(" & x - 1 & ")" 'set array index

                'get properties at that index
                .Cells(1, 2).Value = sc.Eval("p('name')")
                .Cells(1, 2).Value = sc.Eval("p('price_btc')")
                .Cells(1, 3).Value = sc.Eval("p('price_usd')")
                .Cells(1, 4).Value = sc.Eval("p('Rank')")

            Next x
        End With
    End With

End Sub
可能重复的