我正在从 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 个嵌套字典的字典结构,如下所示:
内判 :保存一个部分的键/值对
中间字典 : 使用键/值对保存部分名称和内部指令
外判 : 用 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
进入middledict
然后删除innerdict
的内容所以它可以用于下一节。如果我打到整行的末尾,我复制 middledict
进入outerdict
并删除middledict
的内容所以它可以用于下一行。但运行上述代码后,
middledict
和 innerdict
无法通过 outerdict
访问,似乎它们只是空的。如果我删除那些 .RemoveAll 语句,代码可以正常工作,但会用错误的内容填充字典。在我看来, dict.Add 不会将内容复制到父字典,而是进行引用。这可以解释为什么
.RemoveAll
之后内容为空。 .但是如何解决它,有人可以提示吗?
谢谢。
最佳答案
知道你想用你的数据做什么将对解决方案产生很大的影响。如果您只想检索单个数据项,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")
关于excel - VBA:如何在循环中构建嵌套字典(ByVal?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57290411/