我一直试图找到一种方法,使用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)。
期待在这里向大师学习。
答案 0 :(得分:0)
下面介绍如何使用JSONConverter
设置JSON对象并解析它以获取所需信息。
在课程中添加后,您还必须通过VBE添加对Microsoft Scripting Runtime的引用>工具>引用。
如果我们花点时间检查JSON,我们将看到以下结构:
左边是实际响应,右边是树视图。
返回的初始对象是一个包含一个键"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
开始分为B
,C
和4
列。
因此,我们循环每个字典,我们可以在字典键上使用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行开始写作。
工作表中的输出示例:
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