gpt4 book ai didi

excel - VBA:如何在循环中构建嵌套字典(ByVal?)

转载 作者:行者123 更新时间:2023-12-04 20:51:55 25 4
gpt4 key购买 nike

我正在从 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的内容所以它可以用于下一行。

但运行上述代码后, middledictinnerdict无法通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com