精华内容
下载资源
问答
  • VBA解析JSON数据(6)-- 解析复杂JSON

    千次阅读 2019-08-01 11:01:46
    JSON数据结构中Array和Object可以嵌套,例如下图所示,body是一个Array,其中的元素为Object([0], [1], [2] ... ),对象[0]中即包含普通的键值对`c:"商品"`,也包含Object p(其中包含5个键值对),现在需要提前...

    JSON数据结构中Array和Object可以相互嵌套,如下图所示,body是一个Array,其中的元素为Object([0], [1], [2] … ),对象[0]中即包含普通的键值对c:"商品",也包含Object p(其中包含5个键值对)。现在需要提取方框标注部分的键值。使用VBA按照字符串逐个去解析肯定也可以实现,但是会比较复杂,JSON来自于JavaScript,那么使用JavaScript肯定是最简洁的解决方案。

    假设JSON数据保存在M1单元格中,示例代码如下。

    Sub JSDemo_1()
        Dim objJason As Object
        Dim objSC As Object
        Dim objItem As Object
        Dim iRow As Integer
        Range("A:D").Clear
        [A1:D1] = Array("c", "p.x", "p.y", "p.z")
        Set objSC = CreateObject("ScriptControl")
        objSC.Language = "JScript"
        Set objJason = objSC.eval("s=" & Replace([m1], """c""", """cc"""))
        iRow = 2
        For Each objItem In objJason.body
            With objItem
                Cells(iRow, "A") = .cc
                Cells(iRow, "B") = .p.x
                Cells(iRow, "C") = .p.y
                Cells(iRow, "D") = .p.z
                iRow = iRow + 1
            End With
        Next objItem
        Set objSC = Nothing
        Set objJason = Nothing
        Set objItem = Nothing
    End Sub
    

    代码解析
    第6行代码清空工作表中的前四列。
    第7行代码写入标题行。
    第8行代码创建ScriptControl对象。
    第9行代码指定语言为JavaScript。
    第10行代码使用eval函数加载JSON字符串,返回结果为JScriptTypeInfo对象。此代码中使用了Replace函数将JSON数据中的"c"替换为"cc",其原因在于VBA编辑器的代码自动格式化功能会将
    Cells(iRow, "A") = .c自动修改为Cells(iRow, "A") = .C,由于数据中并不存在节点C,这将导致运行时错误,替换为cc后可以解决这个问题。
    第12行到第20行代码使用循环结构遍历body节点。
    第14行到第17行代码将结果写入工作表中。

    运行示例代码,结果如下。
    在这里插入图片描述
    其他形式的JSON嵌套数据,也可以使用类似的JS代码进行解析。


    相关博文链接:
    VBA解析JSON数据(1)-- Split函数
    VBA解析JSON数据(2)–正则表达式
    VBA解析JSON数据(3)–JavaScript
    VBA解析JSON数据(4)–JavaScript进阶
    VBA解析JSON数据(5)–JavaScript回写Excel


    本文使用的JSON数据。

    ({“outline”:null,“outlineMiss”:null,“font”:{“ad6123f4770bf78a652954510010001”:“宋体”,“ad6123f4770bf78a652954510020001”:“宋体”},“style”:[{“t”:“style”,“c”:[0],“s”:{“font-size”:“18”}},{“t”:“style”,“c”:[0,3,5,6,1],“s”:{“font-family”:“ad6123f4770bf78a652954510010001”}},{“t”:“style”,“c”:[0,2],“s”:{“font-size”:“18”}},{“t”:“style”,“c”:[3],“s”:{“font-size”:“15.12”}},{“t”:“style”,“c”:[0,1,2,3,5,6,4],“s”:{“color”:"#000000"}},{“t”:“style”,“c”:[6,5],“s”:{“bold”:“true”,“letter-spacing”:“0.359”}},{“t”:“style”,“c”:[6],“s”:{“font-size”:“20.88”}}],“body”:[{“c”:“商品”,“p”:{“h”:1048,“w”:729.359,“x”:79.82,“y”:105.82,“z”:197},“ps”:{"_vector":1},“s”:null,“t”:“pic”},{“c”:“一级分类”,“p”:{“h”:18,“w”:72,“x”:84.636,“y”:110.207,“z”:198},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“二级分类”,“p”:{“h”:18,“w”:72,“x”:210.675,“y”:110.207,“z”:199},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“一体机”,“p”:{“h”:18,“w”:53.999,“x”:353.67,“y”:136.487,“z”:201},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“打印机”,“p”:{“h”:18,“w”:54,“x”:210.675,“y”:167.447,“z”:202},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“打印机”,“p”:{“h”:18,“w”:54,“x”:210.675,“y”:198.452,“z”:204},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“打印机”,“p”:{“h”:18,“w”:54,“x”:210.675,“y”:229.412,“z”:206},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“激光打印机”,“p”:{“h”:18,“w”:89.999,“x”:353.67,“y”:167.447,“z”:203},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“喷墨打印机”,“p”:{“h”:18,“w”:89.999,“x”:353.67,“y”:198.452,“z”:205},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“针式打印机”,“p”:{“h”:18,“w”:89.999,“x”:353.67,“y”:229.412,“z”:207},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“复印机”,“p”:{“h”:18,“w”:53.999,“x”:353.67,“y”:256.052,“z”:208},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“传真机”,“p”:{“h”:18,“w”:53.999,“x”:353.67,“y”:278.012,“z”:209},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“扫描仪”,“p”:{“h”:18,“w”:53.999,“x”:353.67,“y”:299.972,“z”:210},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“有绳电话机”,“p”:{“h”:18,“w”:89.999,“x”:353.67,“y”:321.962,“z”:212},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“无绳电话机(子母机)”,“p”:{“h”:18,“w”:161.999,“x”:353.67,“y”:343.923,“z”:214},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“数字无绳电话机”,“p”:{“h”:18,“w”:125.999,“x”:353.67,“y”:365.882,“z”:216},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“无线电话机”,“p”:{“h”:18,“w”:89.999,“x”:353.67,“y”:387.842,“z”:218},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“碎纸机”,“p”:{“h”:18,“w”:53.999,“x”:353.67,“y”:409.802,“z”:219},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“点验钞机”,“p”:{“h”:18,“w”:71.999,“x”:353.67,“y”:431.762,“z”:220},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“电动”,“p”:{“h”:18,“w”:36,“x”:353.67,“y”:453.767,“z”:222},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“手动”,“p”:{“h”:18,“w”:36,“x”:353.67,“y”:475.728,“z”:224},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“纸卡考勤机”,“p”:{“h”:18,“w”:89.999,“x”:353.67,“y”:497.687,“z”:227},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“热敏纸卡考勤机(无需色带)”,“p”:{“h”:15.12,“w”:181.439,“x”:353.31,“y”:520.681,“z”:229},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[3]},{“c”:“办公设备”,“p”:{“h”:24.12,“w”:97.559,“x”:85.356,“y”:133.75,“z”:200},“ps”:{"_cover":true,"_enter":1},“s”:{“font-size”:“24.119”},“t”:“word”,“r”:[5]},{“c”:“电话机”,“p”:{“h”:18,“w”:54,“x”:210.675,“y”:321.962,“z”:211},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“电话机”,“p”:{“h”:18,“w”:54,“x”:210.675,“y”:343.923,“z”:213},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“电话机”,“p”:{“h”:18,“w”:54,“x”:210.675,“y”:365.882,“z”:215},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“电话机”,“p”:{“h”:18,“w”:54,“x”:210.675,“y”:387.842,“z”:217},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“装订机”,“p”:{“h”:18,“w”:54,“x”:210.675,“y”:453.767,“z”:221},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“装订机”,“p”:{“h”:18,“w”:54,“x”:210.675,“y”:475.728,“z”:223},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“考勤机”,“p”:{“h”:18,“w”:54,“x”:210.675,“y”:497.687,“z”:226},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“考勤机”,“p”:{“h”:18,“w”:54,“x”:210.675,“y”:519.647,“z”:228},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“考勤机”,“p”:{“h”:18,“w”:54,“x”:210.675,“y”:541.607,“z”:230},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“切纸刀(机)”,“p”:{“h”:18,“w”:90,“x”:210.675,“y”:563.568,“z”:232},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“热熔式 胶圈 铁圈 梳式 财务(铆管)”,“p”:{“h”:15.12,“w”:241.919,“x”:536.61,“y”:476.761,“z”:225},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[3]},{“c”:“会议设备”,“p”:{“h”:18,“w”:72,“x”:210.675,“y”:651.437,“z”:238},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“会议设备”,“p”:{“h”:18,“w”:72,“x”:210.675,“y”:673.397,“z”:240},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“会议设备”,“p”:{“h”:18,“w”:72,“x”:210.675,“y”:695.357,“z”:242},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“监控设备”,“p”:{“h”:18,“w”:72,“x”:210.675,“y”:717.318,“z”:244},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“耗材及配件”,“p”:{“h”:20.879,“w”:105.839,“x”:84.996,“y”:763.474,“z”:247},“ps”:{"_cover":true},“t”:“word”,“r”:[6]},{“c”:“打印耗材”,“p”:{“h”:18,“w”:72,“x”:210.675,“y”:764.507,“z”:248},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“打印耗材”,“p”:{“h”:18,“w”:72,“x”:210.675,“y”:793.307,“z”:250},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“打印耗材”,“p”:{“h”:18,“w”:72,“x”:210.675,“y”:818.867,“z”:252},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“装订耗材”,“p”:{“h”:18,“w”:72,“x”:210.675,“y”:1015.862,“z”:277},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“考勤卡/考勤板”,“p”:{“h”:18,“w”:117,“x”:210.675,“y”:1060.503,“z”:272},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“过塑膜”,“p”:{“h”:18,“w”:54,“x”:210.675,“y”:1082.463,“z”:273},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“办公设备配件”,“p”:{“h”:18,“w”:108,“x”:210.675,“y”:1104.426,“z”:274},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“白色复印纸”,“p”:{“h”:18,“w”:90,“x”:210.675,“y”:1129.661,“z”:276},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“指纹考勤机”,“p”:{“h”:18,“w”:89.999,“x”:353.67,“y”:541.607,“z”:231},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“木质 钢质”,“p”:{“h”:18,“w”:80.999,“x”:353.67,“y”:563.568,“z”:233},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“塑封机”,“p”:{“h”:18,“w”:53.999,“x”:353.67,“y”:585.527,“z”:235},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“收银机”,“p”:{“h”:18,“w”:53.999,“x”:353.67,“y”:607.517,“z”:236},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“标签票据打印机”,“p”:{“h”:18,“w”:125.999,“x”:353.67,“y”:629.478,“z”:237},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“投影机”,“p”:{“h”:18,“w”:53.999,“x”:353.67,“y”:651.437,“z”:239},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“投影幕”,“p”:{“h”:18,“w”:53.999,“x”:353.67,“y”:673.397,“z”:241},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“电子白板”,“p”:{“h”:18,“w”:71.999,“x”:353.67,“y”:695.357,“z”:243},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“监控摄像头”,“p”:{“h”:18,“w”:89.999,“x”:353.67,“y”:717.318,“z”:245},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“扫描枪盘点机”,“p”:{“h”:18,“w”:107.999,“x”:353.67,“y”:739.307,“z”:246},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“硒鼓粉盒”,“p”:{“h”:18,“w”:71.999,“x”:353.67,“y”:764.507,“z”:249},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“碳粉”,“p”:{“h”:18,“w”:36,“x”:353.67,“y”:793.307,“z”:251},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“墨盒”,“p”:{“h”:18,“w”:36,“x”:353.67,“y”:818.867,“z”:253},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“墨水”,“p”:{“h”:18,“w”:36,“x”:353.67,“y”:840.827,“z”:255},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“色带”,“p”:{“h”:18,“w”:36,“x”:353.67,“y”:862.832,“z”:257},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“碳带”,“p”:{“h”:18,“w”:36,“x”:353.67,“y”:884.792,“z”:259},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“鼓”,“p”:{“h”:18,“w”:18,“x”:353.67,“y”:906.752,“z”:261},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“墨粉”,“p”:{“h”:18,“w”:36,“x”:353.67,“y”:928.713,“z”:263},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“版纸”,“p”:{“h”:18,“w”:36,“x”:353.67,“y”:950.672,“z”:265},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“油墨”,“p”:{“h”:18,“w”:36,“x”:353.67,“y”:972.632,“z”:267},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“宝塔线装订线蜡线?”,“p”:{“h”:18,“w”:152.999,“x”:353.67,“y”:994.622,“z”:268},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“装订条钉胶圈铆管”,“p”:{“h”:18,“w”:143.999,“x”:353.67,“y”:1016.582,“z”:270},“ps”:{"_cover":true},“t”:“word”,“r”:[0]},{“c”:“装订胶片热熔封套”,“p”:{“h”:18,“w”:143.999,“x”:353.67,“y”:1038.542,“z”:271},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“A3 A4”,“p”:{“h”:18,“w”:45,“x”:536.969,“y”:563.568,“z”:234},“ps”:{"_cover":true,"_enter":1},“s”:{“font-family”:“ad6123f4770bf78a652954510020001”},“t”:“word”,“r”:[2]},{“c”:" 装订机皮带 装订机针头",“p”:{“h”:18,“w”:198,“x”:536.969,“y”:994.622,“z”:269},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“打印机复印机等维修的零部件等”,“p”:{“h”:18,“w”:251.999,“x”:353.67,“y”:1103.706,“z”:396},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[0]},{“c”:“办公用纸”,“p”:{“h”:20.879,“w”:84.599,“x”:84.996,“y”:1128.628,“z”:275},“ps”:{"_cover":true,"_enter":1},“t”:“word”,“r”:[6]}],“page”:{“ph”:1262.879,“pw”:892.439,“iw”:729,“ih”:1048,“v”:6,“t”:“2”,“pptlike”:false,“cx”:79.82,“cy”:105.82,“cw”:729.359,“ch”:1048.36}})

    展开全文
  • VBA解析JSON数据(1)-- Split函数

    万次阅读 2019-02-16 07:20:48
    什么是JSON? JSON(JavaScript Object Notation) 是一种及其轻量级的...由于JSON天然具备了简洁和清晰的层次结构,易于机器解析和生成,从2005年前后开始JSON成为主流的网络数据传输格式。进行网页数据抓取的时候,...

    什么是JSON?

    JSON(JavaScript Object Notation) 是一种及其轻量级的数据交换格式,它是 ECMAScript (欧洲计算机协会制定的JavaScript规范)的一个子集,它使用完全独立于任何编程语言的文本格式来表示数据。
    由于JSON天然具备了简洁和清晰的层次结构,易于机器解析和生成,从2005年前后开始JSON成为主流的网络数据传输格式。进行网页数据抓取的时候,很多页面请求的返回结果都是JSON格式的。
    详细的JSON标准规范请参考:

    http://json.com/specs/

    JSON是什么样的?

    JSON 本质是一个字符串(由花括号{}包裹起来),它是JavaScript对象的字符串表示法。例如:

    {“applySn”: “粤G妆网备字2017050113”, “applySnTT”: “”, “apply_enter_address”: “”, “enterpriseName”: “广州市金日精细化工有限公司”, “enterpriseNameTT”: “”, “is_off”: “N”, “newProcessid”: “20170421153208vq3fu”, “off_date”: “”, “org_name”: “”, “processid”: “20170421153208vq3fu”, “productName”: “悠莅雅柔美亮肤按摩霜”, “productNameTT”: “”, “provinceConfirm”: “2017-05-17”}

    如何解读JSON?

    据说JSON易于人阅读和编写,我怎么看出来,只看到一堆字符,完全不知道包含什么信息。那么来看看下面这段JSON,是不是顿时觉得清爽了很多,其实内容和上一段完全相同,只是进行了相应的格式化显示。

    {
          "applySn": "粤G妆网备字2017050113",
          "applySnTT": "",
          "apply_enter_address": "",
          "enterpriseName": "广州市金日精细化工有限公司",
          "enterpriseNameTT": "",
          "is_off": "N",
          "newProcessid": "20170421153208vq3fu",
          "off_date": "",
          "org_name": "",
          "processid": "20170421153208vq3fu",
          "productName": "悠莅雅柔美亮肤按摩霜",
          "productNameTT": "",
          "provinceConfirm": "2017-05-17"
    }
    

    KEY和VALUE都由半角双引号包裹,二者之间由冒号做为间隔(冒号之后可能有空格),也就是如下格式,类似于VBA中字典对象。

    "KEY": "VALUE"
    

    例如:provinceConfirm的VALUE为2017-05-17,不难看出此部分数据包含13组KEY和VALUE。
    有很多在线工具可以帮助我们实现JSON的格式转换,这是编程过程中一个非常重要的工具。例如:

    http://jsonviewer.stack.hu/

    除了转换为上面的格式外,还可以转换为表格格式,如下图,有些Excel单元格的味道了。
    在这里插入图片描述

    VBA解析JSON

    非常可惜的是VB流行的年代JSON没出现,所以VBA也不支持JSON对象。但是既然JSON数据本质是一个字符串,VBA中丰富的字符串处理函数应该也可以胜任解析JSON这个工作。下面就以上面的JSON数据为例,演示如何在VBA中进行解析。

    Sub JSON_Split()
        Dim Res(100, 1 To 2)
        Dim objRegEx As Object
        Dim iRow, myStr, arrLine, arrItem
        myStr = Trim([A1].Value)
        Range("A3:B3").Value = Array("Key", "Value")
        myStr = Replace(myStr, """", "")
        myStr = Replace(myStr, " ", "")
        arrLine = Split(Mid(myStr, 2, Len(myStr) - 2), ",")
        iRow = 4
        For i = LBound(arrLine) To UBound(arrLine)
            arrItem = Split(Trim(arrLine(i)), ":")
            Cells(iRow, 1).Resize(1, 2).Value = arrItem
            iRow = iRow + 1
        Next
    End Sub
    

    代码解析
    第5行代码读取保存在工作表A1单元格的JSON字符串。
    第6行代码写入第3行的表头。
    由于KEY和VALUE中没有空格个引号,因此第7行和第8行代码去除JSON字符串中的引号和空格,便于后续拆分。
    第9行使用对号做为分隔符,把JSON字符串进行拆分,结果为"KEY":"VALUE"形式。其中MID函数是为了去除字符串首尾的花括号。
    第12行代码冒号做为分隔符再次拆分。
    第13行代码将结果写入相应行的单元格中。

    运行示例代码,结果如下,妥妥的写入了我们熟悉的单元格,可以很方便使用这些数据了。
    在这里插入图片描述

    JSON中一个KEY也可以对应多个VALUE,对于这类数据,需要再多使用一次SPLIT函数进行拆分。


    相关博文链接:
    VBA解析JSON数据(1)-- Split函数
    VBA解析JSON数据(2)–正则表达式
    VBA解析JSON数据(3)–JavaScript
    VBA解析JSON数据(4)–JavaScript进阶
    VBA解析JSON数据(5)–JavaScript回写Excel

    展开全文
  • 在上一篇博客【VBA解析JSON数据(4)–JavaScript进阶】中利用JavaScript代码实现读取JSON数据KEY和VALUE的功能,但是还有些繁琐。JavaScript代码读取,然后在VBA去写入,其实JavaScript也是很强大的,完全可以直接...

    在上一篇博客【VBA解析JSON数据(4)–JavaScript进阶】中利用JavaScript代码实现读取JSON数据KEY和VALUE的功能,但是还有些繁琐。JavaScript代码读取,然后在VBA去写入,其实JavaScript也是很强大的,完全可以直接操作Exce单元格写入数据。

    示例JSON数据如下所示。

    {
          "applySn": "粤G妆网备字2017050113",
          "applySnTT": "",
          "apply_enter_address": "",
          "enterpriseName": "广州市金日精细化工有限公司",
          "enterpriseNameTT": "",
          "is_off": "N",
          "newProcessid": "20170421153208vq3fu",
          "off_date": "",
          "org_name": "",
          "processid": "20170421153208vq3fu",
          "productName": "悠莅雅柔美亮肤按摩霜",
          "productNameTT": "",
          "provinceConfirm": "2017-05-17"
    }
    

    示例代码如下。

    Sub JSONToRange()
        Dim strJSON As String
        Dim strJSCode As String
        strJSON = [a1]
        strJSCode = "var json,key,col=row=1,d={};for(json in js){col++;for(key in js[json]){if(!d[key]){d[key]=row;ExCell(row++,1)=key;}ExCell(d[key],col)=js[json][key];}}"
        strJSCode = "js=[" & strJSON & "];" & strJSCode
        Range("A3:B3").Value = Array("Name", "Value")
        With CreateObject("ScriptControl")
            .Language = "JScript"
            .AddObject "ExCell", Cells(4, 1)
            .Eval (strJSCode)
        End With
    End Sub
    

    代码解析
    第4行代码读取工作表中的JSON数据。
    第5行和第6行代码为JavaScript代码。

    为了简化代码,VBA代码中使用了JavaScript Minify格式,格式化的JavaScript代码如下:

    var json, key, col = row = 1,
        d = {};
    for (json in js) {
        col++;
        for (key in js[json]) {
            if (!d[key]) {
                d[key] = row;
                ExCell(row++, 1) = key;
            }
            ExCell(d[key], col) = js[json][key];
        }
    }
    

    第8行代码使用后期绑定的方式创建ScriptControl对象,如果使用前期绑定方式,需要在VBE中先引用Microsoft Script Control 1.0
    第9行代码指定ScriptControl对象的语言为JavaScript。
    第10行代码添加名称为ExCell的对象,指向[A4]单元格。
    第11行代码执行JavaScript代码。

    运行示例代码,结果直接写入Excel工作表指定区域,相比上一个示例,代码简洁了许多。
    在这里插入图片描述


    相关博文链接:
    VBA解析JSON数据(1)-- Split函数
    VBA解析JSON数据(2)–正则表达式
    VBA解析JSON数据(3)–JavaScript
    VBA解析JSON数据(4)–JavaScript进阶
    VBA解析JSON数据(5)–JavaScript回写Excel

    展开全文
  • JavaScript代码可以读取JSON数据KEY和VALUE,JSON数据可以多层嵌套,如何获取JSON数据长度呢? 示例JSON数据如下,数据共用3组。 { "people":[ { "firstName":"Brett", "lastName":"McLaughlin", "email":...

    JSON数据可以多层嵌套,如何获取JSON数据长度呢?其实并不需要遍历全部数据,使用JS代码可以轻松获取数据长度。

    示例JSON数据如下,数据共用3组。

    {
       "people":[
          {
             "firstName":"Brett",
             "lastName":"McLaughlin",
             "email":"brettM@abc.com"
          },
          {
             "firstName":"Jason",
             "lastName":"Hunter",
             "email":"jasonH@nbc.com"
          },
          {
             "firstName":"Elliotte",
             "lastName":"Harold",
             "email":"elharoH@mbc.com"
          }
       ]
    }
    

    示例代码如下。

    Sub JasonArryLength()
        Dim Json As String, JS As Object
        Json = "{ ""people"": " & _
            "[{ ""firstName"": ""Brett"", ""lastName"":""McLaughlin"", ""email"": ""brett@newInstance.com"" }," & _
            "{ ""firstName"": ""Jason"", ""lastName"":""Hunter"", ""email"": ""jason@servlets.com"" }, " & _
            "{ ""firstName"": ""Elliotte"", ""lastName"":""Harold"", ""email"": ""elharo@macfaq.com"" }]}"
        Set JS = CreateObject("ScriptControl")
        JS.Language = "JScript"
        fun = "function getlen(s) { return eval('(' + s + ').people.length'); }"
        JS.AddCode fun
        MsgBox JS.Run("getlen", Json)
        Set JS = Nothing
    End Sub
    

    【代码解析】
    第3行代码为JSON字符串。
    第7行代码创建对象。
    第8行代码指定JS语言。
    第9行代码创建JS代码,其中使用length属性返回数据长度。
    第10行代码添加JS代码。
    第11行代码运行JS代码,结果如下。

    在这里插入图片描述

    展开全文
  • VBA(Windows和Mac Excel,Access和其他Office应用程序)的JSON转换和解析。 它出色的项目 ,并进行了添加和改进以解决错误和提高性能(作为一部分)。 在Windows Excel 2013和Excel for Mac 2011中进行了测试,但...
  • VBA解析JSON数据(3)--JavaScript

    千次阅读 2019-02-19 10:57:31
    既然JSON来自于JavaScript,那么用JS想必可以更方便的解析JSON,非常幸运的是VBA中可以使用JS。 示例JSON数据如下所示。 { "applySn": "粤G妆网备字2017050113&...
  • VBA解析JSON数据(2)--正则表达式

    千次阅读 2019-02-18 11:30:15
    上一篇博客【VBA解析JSON数据(1)】讲到过:JSON 本质是一个字符串(由花括号{}包裹起来),解析JSON数据其实就是处理字符串,那么大家肯定会想起字符处理的神奇–正则表达式。 示例JSON数据如下所示。 { &amp...
  • VBA解析json示例1

    2020-10-13 23:13:33
    & json & ")" 'evaluate the json response 'add some accessor functions Sc.addcode "function getSentenceCount(){return obj.sentences.length;}" Sc.addcode "function getSentence(i){return obj.sentences[i]...
  • [VBA] 接收和解析 JSON

    千次阅读 2019-05-23 10:47:14
    '解析JSON 'json = {'a':['a1','a2','a3']} Function ParseJSON(ByVal json As String) 'Set objSC = CreateObject("ScriptControl") '用于32位Excel Set objSC = CreateObjectx86("MSScriptControl.ScriptControl...
  • VBA解析JSON数据(4)--JavaScript进阶

    千次阅读 2019-02-20 15:06:18
    在上一篇博客【VBA解析JSON数据(3)–JavaScript】讲VBA无法直接获取Variant/Object/JScriptTypeInfo对象中的Key,这个难题如何解决呢? 解铃还须系铃人,既然是JavaScript的对象,那么自然还是需要在JavaScript中...
  • 业务中用到vba解析json/xml,这里进行总结笔记。 1.发送请求function Public Function sendReq(ByRef URL As String) As String On Error GoTo err6 Dim HttpReq As MSXML2.XMLHTTP60 Dim ResponseStr As String
  • VBA研究】解析JSON数据的几种方法

    万次阅读 2016-12-09 16:31:01
    网抓数据或者通过接口接收数据时,发来的数据很多是JSON格式,这是JavaScript常用的一种数据结构。对这种数据如何解析呢?先假定发来的数据如下,并针对这个数据给出几种解析方法写成的函数: '返回数据json格式)...
  • ‘(1)把json数据放到excel中 Sub GetJSONDemo() 'url = "http://191.168.0.158:9092/api/index/quotaIntfs/getQuotaIntfGorupTreeWithDetailTable?pageNum=1&pageSize=10&pageSizes=10&pageSizes=...
  • VBA类模块的JSON解析器,允许递归数据
  • 大家好,我们今日讲解“VBA信息获取与处理”教程中第九个专题“利用IE抓取网络数据”的第三节“利用IE,抓取解禁股票数据”,这个专题是非常有用的知识点,希望大家掌握。第四节 利用IE,抓取解禁股票数据大家好,这...
  • 主要介绍了VBScript把json字符串解析json对象的2个方法,本文通过MSScriptControl.ScriptControl和jscript实现,需要的朋友可以参考下
  • 研究了一下发现,我们的差别是使用环境不同,他们用的是64位win10,我用的是32位win7(很土吧),调试发现,ScriptControl控件在64位系统下,无法解析JSon数据。也就是说,32位系统下的代码,在64位系统下失效了。 ...
  • VBA 发送 GET/POST 请求并解析 json 数据

    万次阅读 热门讨论 2019-04-15 11:14:27
    " objSC.AddCode (strJSON) '将 json 由字符串解析为对象 Dim j, k, l Dim arr() '定义一个数组来接收 json 中的数据 ReDim arr(1 To rowNum, 1 To colNum) '可以提高向 Excel 单元格填充数据的效率 indexArr = ['a'...
  • Function weixinAPI(data As String) As String Dim tt$, access_token$, url$ '获取access_token链接 ... '获取打卡数据链接 simURL = "https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckin_month
  • vba解析json数据如下: ``` Sub VBA_Json() Dim JsonStr As String Dim SC As Object Dim AA, BB JsonStr = "{""desc"":""成功"",""dataa"":{""maxPage"":43522,""ppiUsername"":""谢文泽""}}" ...
  • Dim j As API.JSON Set j = New API.JSON j.Parse "{'data':{'route':{'destination':'121.473701,31.230416','origin':'118.796877,32.060255','paths':[{'distance':296768,'duration':15060,'restriction':0,'...
  • "test.json" , dataType: 'json' , success: function (data) { queryTable(data); } }); function queryTable (data) { var thead = "<thead><tr class='danger'><th>" ; var tbody = ...
  • ADODB.Stream创建UTF-8+BOM编码的...另,使用fso创建的文本文件编码为ANSI,ajax解析json时出现乱码无法正常解析。 Sub ToJson() '创建UTF8文本文件  myrange = Worksheets("sheet1").UsedRang
  • #解析resultjson_path文件 import os, sys, shutil, json import os.path as osp from builtins import FileNotFoundError import logging from csv import DictReader resultjson_path='/data/benchmark/...
  • 从和风天气api获得的json数据格式本人不懂解析,望大牛教我。
  • json进阶 一 js读取解析JSON类型数据
  • JSON示例数据文件

    2019-08-13 07:53:52
    JSON数据示例文件,演示如何使用VBA解析复杂JSON数据
  • JSON:JavaScript 对象表示法(JavaScript Object Notation) 和xml相似,都是文本形式(保存在文本文件中或字符串等形式),比如: jsstr = {"系别":"历史系","班级":"一班", "学员":[ {"姓名":"张三",...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 250
精华内容 100
关键字:

vba解析json数据