首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VBA:如何在循环中建立嵌套字典(ByVal?)

问VBA:如何在循环中建立嵌套字典(ByVal?)
EN

Stack Overflow用户
提问于 2019-07-31 12:07:28
回答 1查看 553关注 0票数 2

我正在从Excel电子表格导出几个INI文件,其中一行表示一个INI文件,INI-节和键是列。到目前为止,这还不错,只是VBA似乎正在传递字典ByRef (?),但让我解释一下:

Excel电子表格如下所示:

代码语言:javascript
复制
       |       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保存行名

为了解释我的情况,应该使用以下简化代码:

代码语言:javascript
复制
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之后内容是空的。

但是如何解决这个问题,谁能给我个提示吗?

谢谢。

EN

Stack Overflow用户

发布于 2019-08-01 01:22:20

知道你想用你的数据做什么将对解决方案有很大的影响。如果您只想检索单个数据项,FlorentB关于分隔键的建议很有吸引力。如果您想在这些列表中迭代数据,那么嵌套字典可能是最好的选择。

对于嵌套字典,如您所见,存储对对象的引用。因此,您需要为每个嵌套字典创建一个新的字典实例。因此,一些基本代码如下所示:

代码语言:javascript
复制
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")
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57290411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档