使用VBA将数据从JSON格式的Web API导出到给定的Excel范围

时间:2014-06-14 07:23:00

标签: json excel api vba rest

我一直试图找到一种方法,使用VBA中的Web API在Excel工作表中填充列。要读取的数据是JSON格式。我试图实施Bruce Mcpherson的解决方案,但无法正确完成。 http://ramblings.mcpher.com/Home/excelquirks/classeslink/data-manipulation-classes/howtocdataset

我试图理解堆栈溢出给出的解决方案,但这还没有成功。

必须将数据加载到指定列中的特定工作表中。

数据在此处:http://www.vehicletrack.biz/api/xlsmaster?usr=rahul&pwd=togodeamo&type=2

示例数据:

{"result": [
    {"name":"??? ?????",
     "type":2,
     "latlong":"26.547745,82.431729"},
    {"name":"????",
     "type":2,
     "latlong":"20.169723,85.415944"},
    {"name":"??????",
     "type":2,
     "latlong":"20.674808,76.882579"},
    {"name":"???????",
     "type":2,
     "latlong":"20.664026,76.542137"}
]}

在表格中从第4行开始的三列A(名称),B(类型)和C(Latlong)。

期待在这里向大师学习。

1 个答案:

答案 0 :(得分:0)

下面介绍如何使用JSONConverter设置JSON对象并解析它以获取所需信息。

在课程中添加后,您还必须通过VBE添加对Microsoft Scripting Runtime的引用>工具>引用。

如果我们花点时间检查JSON,我们将看到以下结构:

sample of the response

左边是实际响应,右边是树视图。

返回的初始对象是一个包含一个键"result"的字典。

使用JSONConverter我们可以通过其返回字典集合的键直接获取该字典值。左侧的"["表示集合与右侧的[7689]一样。每个字典有3项,因此7689/3 = 2563字典。您可以使用集合的.Count属性进行确认。

Set json = JsonConverter.ParseJson(strJSON)("result") 

我们可以将每个项目的集合设置循环到字典对象变量/或仅用于后期绑定的对象。

For Each i In json
    Set dict = i
    'Other code
Next i

然后我们可以遍历各个字典键:

对于每个key2在dict.Keys中        '其他代码    下一个key2

现在,您已声明您对字典中的值感兴趣,其中包含“name”,“type”和“latlong”键;并且您希望这些分别从行A开始分为BC4列。

因此,我们循环每个字典,我们可以在字典键上使用Select Case语句来确定应该将值写入哪个列:

Select Case key2
Case "name"
    .Cells(counter, 1) = dict(key2)
Case "type"
   .Cells(counter, 2) = dict(key2)
Case "latlong"
   .Cells(counter, 3) = dict(key2)
End Select

在每个字典循环后,我们需要在counter变量中添加一个变量来确定我们写入哪一行,所以我们写入下一行。 counter已于4启动,因此我们从第4行开始写作。

工作表中的输出示例:

Example output

VBA代码:

Option Explicit   
Public Sub GetInfo()
    Dim strURL As String, strJSON As String
    Dim http As Object
    Dim json As Object, item As Long

    Application.ScreenUpdating = False
    strURL = "http://www.vehicletrack.biz/api/xlsmaster?usr=rahul&pwd=togodeamo&type=2"

    Set http = CreateObject("MSXML2.XMLHTTP")
    http.Open "GET", strURL, False
    http.send
    strJSON = http.responseText
    Set json = JsonConverter.ParseJson(strJSON)("result") 'dictionary one key of "Result" which is a collection of dictionaries when accessed

    Dim i As Object, dict As Object, key2 As Variant, counter As Long
    counter = 4
    For Each i In json
        Set dict = i
        For Each key2 In dict.Keys
            With ActiveSheet
                Select Case key2
                Case "name"
                    .Cells(counter, 1) = dict(key2)
                Case "type"
                    .Cells(counter, 2) = dict(key2)
                Case "latlong"
                    .Cells(counter, 3) = dict(key2)
                End Select
            End With
        Next key2
        counter = counter + 1
    Next i
    Application.ScreenUpdating = True
End Sub