如何在VBA Excel中以良好格式显示我的JSON对象
我知道当Json很简单的时候,我会在cell Excel中显示我的解析Json,但现在我有了字符串、对象和数组,我有点迷路了。。 我的json如下所示:如何在VBA Excel中以良好格式显示我的JSON对象,json,excel,vba,Json,Excel,Vba,我知道当Json很简单的时候,我会在cell Excel中显示我的解析Json,但现在我有了字符串、对象和数组,我有点迷路了。。 我的json如下所示: [ { "name": null, "type": null, "actions": [], "screen": null, "container": null, "sysid": 5, "uftitem": null
[
{
"name": null,
"type": null,
"actions": [],
"screen": null,
"container": null,
"sysid": 5,
"uftitem": null
},
{
"name": null,
"type": null,
"actions": [],
"screen": null,
"container": null,
"sysid": 6,
"uftitem": null
},
{
"name": "UTProject5",
"type": "type",
"actions": [
{
"name": "UTProject",
"description": "UTProject",
"pattern": "UTProject",
"isCheck": true,
"sysid": 1,
"uftaction": {
"sysid_uftAction": 2,
"code": "code uft",
"maxTime": 10,
"nbCycle": 20
}
},
{
"name": "UTProject2",
"description": "UTProject",
"pattern": "UTProject",
"isCheck": true,
"sysid": 3,
"uftaction": {
"sysid_uftAction": 4,
"code": "code uft",
"maxTime": 10,
"nbCycle": 20
}
}
],
"screen": {
"name": null,
"type": null,
"actions": [],
"screen": null,
"container": null,
"sysid": 5,
"uftitem": null
},
"container": {
"name": null,
"type": null,
"actions": [],
"screen": null,
"container": null,
"sysid": 6,
"uftitem": null
},
"sysid": 7,
"uftitem": {
"code": "code",
"parentCode": "tooooz",
"sysid": 8
}
},
{
"name": "UTProject6",
"type": "type",
"actions": [
{
"name": "UTProject",
"description": "UTProject",
"pattern": "UTProject",
"isCheck": true,
"sysid": 1,
"uftaction": {
"sysid_uftAction": 2,
"code": "code uft",
"maxTime": 10,
"nbCycle": 20
}
},
{
"name": "UTProject2",
"description": "UTProject",
"pattern": "UTProject",
"isCheck": true,
"sysid": 3,
"uftaction": {
"sysid_uftAction": 4,
"code": "code uft",
"maxTime": 10,
"nbCycle": 20
}
}
],
"screen": {
"name": null,
"type": null,
"actions": [],
"screen": null,
"container": null,
"sysid": 5,
"uftitem": null
},
"container": {
"name": null,
"type": null,
"actions": [],
"screen": null,
"container": null,
"sysid": 6,
"uftitem": null
},
"sysid": 9,
"uftitem": {
"code": null,
"parentCode": null,
"sysid": 10
}
}
]
我想访问我想要的并在单元格中显示它,但我不知道在数组和对象中的访问权限
谢谢大家 概述:
您可以使用以下代码清空整个内容,该代码使用:
注:
我正在从工作表中读取JSON字符串,并通过JSONConverter存储在对象中。初始对象是一个集合。我使用TypeName函数*循环该集合和其中的每个嵌套级别,以确定在每个级别存储哪些对象。然后,我使用selectcase适当地处理这些对象
更有效的方法是设计一个可重用的类来处理这个问题。我已经看到了一些其他问题,在哪里可以做到这一点
*实际上更健壮
示例JSON
立即窗口的示例代码输出:
您可以通过将Debug.Print语句替换为工作表范围的赋值来选择写入单元格的方式
VBA:
我们还可以看到,在名称不为null的字典中,actions包含另一个字典集合。如前所述,我们有[后跟{
我们可以看到每个内部字典都有名称、描述等键。我们还可以看到它们的值具有不同的数据类型
观察JSON结构中的操作,您可以看到这些操作使用示例字典:
字符串名称:UTProject
字符串说明:UTProject
字符串模式:UTProject
布尔isCheck:true
双系统ID:1
Dictionary uftacon'keys of==>sysid\u uftacon:2,code:code-uft,maxTime:10,nbCycle:20
因此,我们可以使用selectcase通过使用TypeName进行测试来处理数据类型
对于基本布尔型、字符串型和双精度数据类型,我们可以使用键简单地打印它们
json(i)("actions")(j)("isCheck")
这将是True或False的布尔结果。i和j是外部和内部集合循环中当前位置的索引
对于字典uftaction,我们可以循环其键:
For Each key2 In json(i)("actions")(j)(key).keys
Debug.Print "actions " & key & " " & key2 & " " & json(i)("actions")(j)(key)(key2)
Next key2
当然,您可以使用密钥的名称进行访问,而不必在末尾对密钥进行循环,例如:
json(i)("actions")(j)(key)("maxTime")
在整个过程中,您可以通过索引而不是循环访问特定位置,这样i和j将直接替换为一个数值,key、key2等可以替换为任何给定key的实际文本字符串
希望这能给你更多的洞察力
VBA:
概述:
您可以使用以下代码清空整个内容,该代码使用:
注:
我正在从工作表中读取JSON字符串,并通过JSONConverter存储在对象中。初始对象是一个集合。我使用TypeName函数*循环该集合和其中的每个嵌套级别,以确定在每个级别存储哪些对象。然后使用Select Case适当地处理这些对象
更有效的方法是设计一个可重用的类来处理这个问题。我已经看到了一些其他的问题,在哪里可以做到这一点
*实际上更健壮
示例JSON
立即窗口的示例代码输出:
您可以通过将Debug.Print语句替换为工作表范围的赋值来选择写入单元格的方式
VBA:
我们还可以看到,在名称不为null的字典中,actions包含另一个字典集合
我们可以看到每个内部字典都有名称、描述等键。我们还可以看到它们的值具有不同的数据类型
观察JSON结构中的操作,您可以看到这些操作使用示例字典:
字符串名称:UTProject
字符串说明:UTProject
字符串模式:UTProject
布尔isCheck:true
双系统ID:1
Dictionary uftacon'keys of==>sysid\u uftacon:2,code:code-uft,maxTime:10,nbCycle:20
因此,我们可以使用selectcase通过使用TypeName进行测试来处理数据类型
对于基本布尔型、字符串型和双精度数据类型,我们可以使用键简单地打印它们
json(i)("actions")(j)("isCheck")
这将是True或False的布尔结果。i和j是外部和内部集合循环中当前位置的索引
对于字典uftaction,我们可以循环其键:
For Each key2 In json(i)("actions")(j)(key).keys
Debug.Print "actions " & key & " " & key2 & " " & json(i)("actions")(j)(key)(key2)
Next key2
当然,您可以使用密钥的名称进行访问,而不必在末尾对密钥进行循环,例如:
json(i)("actions")(j)(key)("maxTime")
在整个过程中,您可以通过索引而不是循环访问特定位置,这样i和j将直接替换为一个数值,key、key2等可以替换为任何给定key的实际文本字符串
希望这能给你更多的洞察力
VBA:
请看下面的示例。将模块导入VBA项目以进行JSON处理 选项显式 附属的 测验 将字符串作为字符串 Dim vJSON 将字符串设置为Dim 暗阿达塔 暗淡的领头人 迪姆·弗雷苏特 '从文件C:\Test\sample.JSON读取JSON样本 sJSONString=ReadTextFileC:\Test\sample.json,0 '解析JSON示例 解析sJSONString、vJSON、sState 如果sState=错误,则 MsgBox无效JSON 终止 如果结束 '将原始JSON转换为2d数组并输出到工作表1 JSON.ToArray vJSON,aData,aHeader 用床单1 .Cells.Delete .Cells.WrapText=False 输出阵列,1号,1号,A区 Output2DArray.Cells2,1,aData .Columns.AutoFit 以 '展平JSON 展平vJSON,vResult '将扁平JSON转换为二维数组并输出到工作表2 JSON.ToArray vResult,aData,a负责人 附页2 .Cells.Delete .Cells.WrapText=False 输出阵列,1号,1号,A区 Output2DArray.Cells2,1,aData .Columns.AutoFit 以 MsgBox已完成 端接头 子输出阵列作为范围,aCells作为变型 使用oDstRng .Parent.Select 使用.Resize1,UBoundaCells-LBoundaCells+1 .NumberFormat=@ .Value=aCells 以 以 端接头 子输出2DRARRAYODSTRNG作为范围,aCells作为变型 使用oDstRng .Parent.Select 使用。调整大小_ UBoundaCells,1-LBoundaCells,1+1_ UBoundaCells,2-LBoundaCells,2+1 .NumberFormat=@ .Value=aCells 以 以 端接头 函数readTextFilePath作为字符串,lFormat作为字符串 'lFormat-2-系统默认值,-1-Unicode,0-ASCII 使用CreateObjectScripting.FileSystemObject.OpenTextFilePath,1,False,lFormat ReadTextFile= 如果不是.AtEndOfStream,则ReadTextFile=.ReadAll 关 以 端函数
顺便说一句,采用了类似的方法。看看下面的例子。将模块导入VBA项目以进行JSON处理 选项显式 子测试 将字符串作为字符串 Dim vJSON 将状态设置为字符串 暗阿达塔 暗淡的领头人 迪姆·弗雷苏特 '从文件C:\Test\sample.JSON读取JSON样本 sJSONString=ReadTextFileC:\Test\sample.json,0 '解析JSON示例 解析sJSONString、vJSON、sState 如果sState=错误,则 MsgBox无效JSON 终止 如果结束 '将原始JSON转换为2d数组并输出到工作表1 JSON.ToArray vJSON,aData,aHeader 用床单1 .Cells.Delete .Cells.WrapText=False 输出阵列,1号,1号,A区 Output2DArray.Cells2,1,aData .Columns.AutoFit 以 '展平JSON 展平vJSON,vResult '将扁平JSON转换为二维数组并输出到工作表2 JSON.ToArray vResult,aData,a负责人 附页2 .Cells.Delete .Cells.WrapText=False 输出阵列,1号,1号,A区 Output2DArray.Cells2,1,aData .Columns.AutoFit 以 MsgBox已完成 端接头 子输出阵列作为范围,aCells作为变型 使用oDstRng .Parent.Select 使用.Resize1,UBoundaCells-LBoundaCells+1 .NumberFormat=@ .Value=aCells 以 以 端接头 子输出2DRARRAYODSTRNG作为范围,aCells作为变型 使用oDstRng .Parent.Select 使用。调整大小_ UBoundaCells,1-LBoundaCells,1+1_ UBoundaCells,2-LBoundaCells,2+1 .NumberFormat=@ .Value=aCells 以 以 端接头 函数readTextFilePath作为字符串,lFormat作为字符串 'lFormat-2-系统默认值,-1-Unicode,0-ASCII 使用CreateObjectScripting.FileSystemObject.OpenTextFilePath,1,False,lFormat ReadTextFile= 如果不是.AtEndOfStream,则ReadTextFile=.ReadAll 关 以 端函数
顺便说一句,采用了类似的方法。Nice post。非常彻底,而且VBA+JSON的资源非常有限,像这样的东西对manyNice post很有用。非常彻底,而且VBA+JSON的资源非常有限,这样的东西对很多人都很有用