Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 分析VBA字典中的数组项时下标超出范围-无法使用索引0_Arrays_Vba_Dictionary_Indexing - Fatal编程技术网

Arrays 分析VBA字典中的数组项时下标超出范围-无法使用索引0

Arrays 分析VBA字典中的数组项时下标超出范围-无法使用索引0,arrays,vba,dictionary,indexing,Arrays,Vba,Dictionary,Indexing,我创建了一个文本文件,其中有一行看起来像这样的{“key 1”:[“item1”,“item2”],“key 2”:“ItemX”},并将其保存为test.json。然后,我尝试使用下面的VBA子例程分析“键1”中数组中的项: Sub testjs3() Dim FSO As New FileSystemObject Dim JsonTS As TextStream Dim JsonText As String Dim Parsed As Scripting.Di

我创建了一个文本文件,其中有一行看起来像这样的
{“key 1”:[“item1”,“item2”],“key 2”:“ItemX”}
,并将其保存为test.json。然后,我尝试使用下面的VBA子例程分析“键1”中数组中的项:

Sub testjs3()
    Dim FSO As New FileSystemObject
    Dim JsonTS As TextStream
    Dim JsonText As String
    Dim Parsed As Scripting.Dictionary

    Set JsonTS = FSO.OpenTextFile("C:\test.json", ForReading)
    JsonText = JsonTS.ReadAll
    JsonTS.Close
    Debug.Print JsonText
    Set Parsed = JsonConverter.ParseJson(JsonText)
    
    Debug.Print Parsed.Item("key 1")(0)
    Debug.Print Parsed.Item("key 1")(1)

End Sub
Debug.Print Parsed.Item(“键1”)(0)
导致VBA返回下标超出范围的错误,而如果我注释掉该错误行,则为索引1处的项解析“键1”的下一行似乎返回数组中的第一个项,在本例中为“项1”。我无法理解索引0返回错误的原因

然后,我使用了另一个创建字典的子例程,而不是从json文件中读取字典,该子例程如下所示:

Sub test4()
 Dim keywords As Object
    
    Set keywords = CreateObject("scripting.dictionary")
    
    keywords.Add "key 1", Array("item1", "item2")
    keywords.Add "key 2", "ItemX"
    
    Debug.Print keywords.Item("key 1")(0)
    Debug.Print keywords.Item("key 1")(1)
    Debug.Print keywords.Item("key 2")
    
    Debug.Print JsonConverter.ConvertToJson(keywords)
        
End Sub
这一次,字典使用索引0返回了“key 1”数组中的正确项,调试打印还显示了从文件读取的json字符串和通过dictionary.add命令创建的json字符串是相同的


我肯定我错过了什么,非常感谢你的建议。

亚历克斯有答案。
JsonConverter.ParseJson
中返回的数组是从索引1开始的集合类型,而通过dictionary对象
.add
方法创建的数组是从索引0开始的基于0的数组类型。

已解析。项(“键1”)
返回一个
集合
,通常情况下,它的起始索引为
1
,因此第一个元素是
关键字。项(“键1”)(1)
不是
(0)
嗨,Alex,那么子程序test4()中的代码如何,它使用了相同的命令和访问方法,但是索引0指向第一项。导致这种行为的区别是什么?将你的2个子集
Debug.Print TypeName(keywords.Item(“key 1”))
的最后一行作为最后一行,你会看到区别——一个是基于1的集合,另一个是基于0的数组。嗨,Alex,你完全正确(谢谢!)。按照您的建议,两个字典的数组类型确实有所不同。我用了VBE手表窗口,它显示的和你说的一样。