我正在从Excel电子表格导出几个INI文件,其中一行表示一个INI文件,INI-节和键是列。到目前为止,这还不错,只是VBA似乎正在传递字典ByRef (?),但让我解释一下:
Excel电子表格如下所示:
| section 1 | section 2 | section 3 | ...
| key1 | key2 | key3 | key4 | key3 | ...
name 1 | value | value | value | value | value | ...
name 2 | value | value | value | value | value | ...
...我从电子表格中动态获取所有INI部分、键和值,这就是为什么我决定不构建类模块,而是使用3个嵌套字典设置字典结构:
innerdict:保存一个区段的键/值对
middledict:使用键/值对保存节名和innerdict
outerdict:用middledict保存行名
为了解释我的情况,应该使用以下简化代码:
Set outerDict = New Scripting.Dictionary
Set middleDict = New Scripting.Dictionary
Set innerDict = New Scripting.Dictionary
For row = 3 to 10
For col = 1 to 5
key = Cells(a,b).Value
value = Cells(x,y).Value
innerdict.Add key, value
If nextSectionGroup Then
middledict.Add sectionName, innerdict
innerdict.RemoveAll
End If
Next col
outerdict.Add linename, middledict
middledict.RemoveAll
Next row用词:
从第一个值行开始,循环遍历列,填充innerdict中的键/值对,直到到达节的末尾为止。
然后,我(希望)将innerdict复制到middledict中,然后删除innerdict的内容,以便在下一节中使用。如果我到达整个行的末尾,我会将middledict复制到outerdict中,并删除middledict的内容,以便可以用于下一行。
但是在运行上述代码之后,middledict和innerdict无法通过outerdict访问,似乎它们只是空的。如果我删除这些.RemoveAll语句,代码可以正常工作,但会用错误的内容填充dicts。
在我看来,dict.Add并没有将内容复制到父dict,而是进行引用。这就解释了为什么在.RemoveAll之后内容是空的。
但是如何解决这个问题,谁能给我个提示吗?
谢谢。
发布于 2019-08-01 01:22:20
知道你想用你的数据做什么将对解决方案有很大的影响。如果您只想检索单个数据项,FlorentB关于分隔键的建议很有吸引力。如果您想在这些列表中迭代数据,那么嵌套字典可能是最好的选择。
对于嵌套字典,如您所见,存储对对象的引用。因此,您需要为每个嵌套字典创建一个新的字典实例。因此,一些基本代码如下所示:
Dim v As Variant
Dim r As Long, c As Long
Dim nameDic As Dictionary, secDic As Dictionary, valDic As Dictionary
'Find area of data.
With Sheet1
r = .Cells(.Rows.Count, 1).End(xlUp).Row
c = .Cells(2, .Columns.Count).End(xlToLeft).Column
v = .Range(.Cells(1, 1), .Cells(r, c)).Value2
End With
'Populate dictionaries.
Set nameDic = New Dictionary
For r = 3 To UBound(v, 1)
Set secDic = New Dictionary
nameDic.Add v(r, 1), secDic
For c = 2 To UBound(v, 2)
If Not IsEmpty(v(1, c)) Then
'It's a new section.
Set valDic = New Dictionary
secDic.Add v(1, c), valDic
End If
valDic.Add v(2, c), v(r, c)
Next
Next
'Single data items can be retrieved like so:
Debug.Print nameDic("name 2")("section 2")("key 4")https://stackoverflow.com/questions/57290411
复制相似问题