Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >VBA分析多个值

VBA分析多个值
EN

Stack Overflow用户
提问于 2020-03-03 07:05:25
回答 1查看 371关注 0票数 1

我在使用带有多个值键的JSON转换器时遇到了问题。

我有为导航JSON树而编写的普通递归例程,但是这里有一个简单的JSON解析示例,我似乎无法工作。

看看这个VBA转换软件,它是非常棒和快速的。

环境: Windows 7/ Access 2016 /专用局域网(无互联网)

下面是代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Option Compare Database
Option Explicit

Sub testparse()
Dim js As String, i As Long, jo As Object, item As Variant
Dim keys(), vals()

' fails on this string
js = "{ !Category!: !Famous Pets!," & _
  "!code!: [!a!,!b!,!c!] }"            ' string with multiple values

' with the following string, this works
js = "{ !Category!: !Famous Pets!," & _
  "    !code!: !singlecodevalue! }"

js = Replace(js, "!", Chr(34)) ' replace ! with quotes

Debug.Print " js = " & js
Set jo = JsonConverter.ParseJson(js) ' returns object with json elements
i = 0
ReDim keys(1 To jo.Count)
ReDim vals(1 To jo.Count)

Debug.Print " Number keys found at top level " & jo.Count
For Each item In jo
    i = i + 1
    keys(i) = item
    vals(i) = jo(item)
    Next item

For i = 1 To jo.Count
    Debug.Print "key " & keys(i) & " = " & vals(i)
    Next i

End Sub
EN

回答 1

Stack Overflow用户

发布于 2020-03-03 08:51:02

对于在JSON对象中运行时遇到的每一项,您必须确定所处理的是什么--特别是如果您不提前知道数组中有多少项!如果您有一个带有数组内部集合的复合JSON结构,那么它就会变得更加棘手。

底线是,您必须检查从JSON对象中提取的每一项,并在访问JSON对象之前找出它是什么。JSON对象的顶层(假设使用JsonConverter)总是一个Dictionary。因此,您可以指望通过顶级字典的键循环:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Dim json As Dictionary
Set json = JsonConverter.ParseJson(someJsonString)

Dim topLevelKey As String
For Each topLevelKey In json
    Dim item As Variant
    Debug.Print topLevelKey & " = " & item
Next topLevelKey 

问题是,item并不总是一个简单的字符串。它可以是值(String)、数组(Collection)或组(Dictionary)。将这个答案看作是一个很好的参考。

基本上,这意味着您必须在使用每个item之前检查它。所以你可以这样检查它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Select Case TypeName(item)
    Case "Collection"
        '--- loop through the item as a Collection
    Case "Dictionary"
        '--- loop through the item as a Dictionary
    Case Else
        '--- the item is a value of some type (String, Boolean, etc)
End Select

在这里的示例中,我创建了一个名为ParseItem的子程序,它以这种方式检查每个项。将原始代码重新工作到下面的示例中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Option Explicit

Sub testparse()
    Dim js As String, i As Long, jo As Object, item As Variant
    Dim keys(), vals()

    ' fails on this string
    js = "{ !Category!: !Famous Pets!," & _
         "!code!: [!a!,!b!,!c!] }"               ' string with multiple values

    ' with the following string, this works
    '    js = "{ !Category!: !Famous Pets!," & _
    '         "    !code!: !singlecodevalue! }"

    '--- compound example
    '    js = "{ !Category!: !Famous Pets!,!code!: [!a!,!b!,{!c! : { !c1! : !1!, !c2!:!2!}}] }"

    js = Replace(js, "!", Chr(34))               ' replace ! with quotes

    Debug.Print "----------------------"
    Debug.Print "js = " & js
    Set jo = JsonConverter.ParseJson(js)         ' returns object with json elements
    ParseDictionary 1, "root", jo
End Sub

Private Sub ParseCollection(ByVal level As Long, _
                            ByVal key As String, _
                            ByRef jsonCollection As Variant)
    Dim item As Variant
    For Each item In jsonCollection
        ParseItem level, key, item
    Next item
End Sub

Private Sub ParseDictionary(ByVal level As Long, _
                            ByVal key As String, _
                            ByRef jsonDictionary As Variant)
    Dim dictKey As Variant
    For Each dictKey In jsonDictionary
        ParseItem level, dictKey, jsonDictionary(dictKey)
    Next dictKey
End Sub

Private Sub ParseItem(ByVal level As Long, _
                      ByVal key As String, _
                      ByRef item As Variant)
    Select Case TypeName(item)
    Case "Collection"
        Debug.Print Format(level + 1, "00 ") & key & " (collection)"
        ParseCollection (level + 1), key, item
    Case "Dictionary"
        Debug.Print Format(level + 1, "00 ") & key & " (dictionary)"
        ParseDictionary (level + 1), key, item
    Case Else
        Debug.Print Format(level, "00 ") & key & " = " & item
    End Select
End Sub
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60510128

复制
相关文章
VBA汇总多个Sheet数据
有1个工作簿,多个工作表,格式一致,按某列作为关键字(具有唯一性),汇总数据,以工作表名称作为汇总后的新列名称,并生成1列合计。
xyj
2020/07/28
1.6K0
VBA汇总多个Sheet数据
VBA技巧:复制多个工作表
有时候,我们想要批量复制多个工作表到新的工作簿,可以使用VBA代码来实现。例如,工作簿中有三个工作表,其名称分别为:Data、完美Excel和Output,要将这三个工作表一次复制到一个新的工作簿中并保存,示例代码如下:
fanjy
2022/11/16
2.5K0
VBA数组的排序_vba函数返回值 数组
我们平时用的表格排序,只相对来说是在在表格中的升序降序。今天就好奇如果数组中实现排序 他是怎么实现的呢。
全栈程序员站长
2022/11/15
3.4K0
VBA数组的排序_vba函数返回值 数组
VBA汇总多个Excel文件数据
将某个文件夹下,所有Excel文件及子文件夹下的Excel文件内容,复制到一张汇总表。
xyj
2020/07/28
2.7K0
VBA汇总多个Excel文件数据
java:函数--返回多个值
1、【使用集合类】使用map返回值;这个方法问题是,你并不知道如何返回值的key是什么,只能通过doc或者通过源代码来查看。
用户7886150
2020/12/14
2.6K0
Golang flag 获取多个值
但是在某些情况下,我们要对一个key指定多个值。 并获取多个值得数组。 这时我们需要定义一个Type Value接口类型
用户1416054
2018/08/02
4.5K0
使用VBA查找最接近的值
有时候,不一定会查找到精确的值,如果是这样的话,应该可以找到最接近的值。有很多公式可以实现,然而本文不使用公式,而是使用VBA代码来实现。
fanjy
2022/11/16
2.1K0
VBA实用小程序79:统计不同值或唯一值的VBA自定义函数
我们说,这组数据有6个不同值:a,b,c,d,e,f;有3个唯一值:c,d,f,因为它们在列表中只出现了1次。
fanjy
2021/07/12
1.8K0
VBA实用小程序79:统计不同值或唯一值的VBA自定义函数
VBA实例01:复制多个Excel表到Word
有些时候,需要将多个Excel表复制到Word文档中指定的位置。一般可以使用通常的复制/粘贴操作,然而如果表很多的话,VBA就派上用场了。
fanjy
2020/11/24
4.6K0
VBA实例01:复制多个Excel表到Word
使用VBA跨单元格分配值
这是在exceloffthegrid.com中看到的一个案例,一个非常有用的节省时间的宏:在单元格之间分配值。
fanjy
2023/08/29
3200
使用VBA跨单元格分配值
VBA编程练习04. 在多个单元格区域查找多个数
如下图1所示的工作表,在单元格区域A2:F2中放置的是要查找的数值;在列H至列BF、行9至行30是被查找的区域,这个区域分17个小区域,每个区域3列,其单元格中要么为空,要么放置着一些数值。
fanjy
2019/07/23
1.6K0
函数的多个返回值
def func1(): # return 值1,值2 --- return有一个作用是打断程序的运行 return 1 + 1 , 2 + 2, 3+4 num1,num2,num3 = func1() print(func1()) print(num1) print(num2) print(num3)
汪凡
2018/05/29
5.6K0
ASP获取多个CheckBox的值
<form id="form" name="form" method="post" action="/temp/test9.asp">    <input name="yi" type="checkbox" id="yi" value="111" />    <input name="yi" type="checkbox" id="yi" value="222" />    <input name="yi" type="checkbox" id="yi" value="333" />    <input type="submit" name="Submit" value="提交" /> </form>
Tony老师
2020/03/05
5.4K0
python输出多个变量的值。
有点类似于C语言 print("%s,%d,%d"%(name ,age ,school))
py3study
2020/01/10
5K0
sp_executesql返回多个值
select @sql=N’select @c=(select count(*) from yg);select @s=(select sum(b_id) from yg)’
全栈程序员站长
2022/08/30
9400
移除重复值,使用VBA的RemoveDuplicates方法
查找重复值、移除重复值,都是Excel中的经典问题,可以使用高级筛选功能,也可以使用复杂的公式,还可以使用VBA。
fanjy
2022/03/07
8.2K0
移除重复值,使用VBA的RemoveDuplicates方法
二值图拓扑性质 —— 多个物体
图像处理时,视野中经常会出现多个物体,对于图像中的各个区域,我们必须将它们以某种方式标注出来,然后,分别计算:各个区域的面积、一阶矩和二阶矩。
为为为什么
2022/08/09
1.7K0
二值图拓扑性质 —— 多个物体
一个函数返回多个值
第一种方法:函数返回的是一个指针地址(数组地址),这个内存地址有多个变量寄存在里面。这个方法我不太会用,传地址传值我常常搞的淅沥糊涂。
Java架构师必看
2021/03/22
1.4K0
cssjshtml vue.js if过滤 if多个值
通过表单内每行根据status的数值,控制是否显示button。过滤数值的是一个数组列表。
葫芦
2019/08/19
3.4K0
Oracle实现like多个值的查询
某天客户有一个需求,给定一批的手机号码或者电话号码,查询出相关的通话记录,以及相关的一些信息。
星哥玩云
2022/08/16
2.8K0
Oracle实现like多个值的查询

相似问题

VBA查找多个值

14

vba值更改多个值

20

Excel VBA :多个查找值

12

Excel VBA错误分析

314

VBA代码分析工具

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文