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

标签 excel vba dictionary nested

我正在从 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/

相关文章:

vba - MS Office 2013 - VBA 密码安全

vba - Excel vba : restrict edit area in excel sheet

c# - 不指定参数的函数字典

c++ - 将一个函数的 vector + map 版本合并为一个兼容的版本

c++ - C++中的 map 与多 map (性能)

excel - 如何以绝对单位设置列宽?

javascript - exceljs - 将填充应用于单元格范围

c# - VSTO:将元数据附加到 Excel 中的单元格?

excel - 在 Excel 中使用结构化引用对 AlphaNumeric 进行排序

vba - FileSystemObject.CreateFolder 创建目录和子目录