【问题标题】:Dictionary inside a Dictionary字典中的字典
【发布时间】:2015-09-17 01:25:21
【问题描述】:

我找到了一个旧方法http://www.techbookreport.com/tutorials/vba_dictionary2.html 在 VBA 的字典中执行字典,但在脚本库中的 Excel 2013 修改中,我无法使嵌套以相同的方式工作。

还有吗?

Sub dict()

Dim ws1 As Worksheet: Set ws1 = Sheets("BM")
Dim family_dict As New Scripting.Dictionary
Dim bm_dict As New Scripting.Dictionary
Dim family As String, bm As String
Dim i

Dim ws1_range As Range
Dim rng1 As Range

With ws1

    Set ws1_range = .Range(Cells(2, 1).Address & ":" & Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1).Address)

End With


For Each rng1 In ws1_range
    family = ws1.Cells(rng1.Row, 1)
    bm = ws1.Cells(rng1.Row, 2)

    If family_dict.Exists(family) Then
        Set bm_dict = family_dict(family)("scripting.dictionary")

        If bm_dict.Exists(bm) Then
        Else
            bm_dict.Add bm, Empty
        End If
    Else
        family_dict.Add family, Empty
        Set bm_dict = family_dict(family)("scripting.dictionary")

        If bm_dict.Exists(bm) Then
        Else
            bm_dict.Add bm, Empty
        End If
    End If
        For Each i In family_dict.Keys: Debug.Print i: Next
        For Each i In bm_dict.Keys: Debug.Print i: Next
        For Each i In bm_dict.Items: Debug.Print i: Next
        Debug.Print bm_dict.Count

Next

End Sub

【问题讨论】:

  • vba 和 vbscript 是旧的、稳定的技术。如果 2013 年字典的语义有任何变化,我会感到惊讶。
  • 我已经看到了一些所谓的字典例程字典,我通常对为什么不使用带有连接值作为项目的单个字典(例如,像 Atom 提要)感到震惊。 \
  • 您不能使用此语法:Set bm_dict = family_dict(family)("scripting.dictionary")。您必须使用与链接中相同的方法:Set myDictionary = New Dictionary 然后将其添加为父字典的项目。我也在this 回答中做了一个工作示例,您可以根据您的数据进行调整

标签: vba excel


【解决方案1】:

我的工作表的工作代码:

Sub dict()

    Dim ws1 As Worksheet: Set ws1 = Sheets("BM")
    Dim family_dict As Dictionary, bm_dict As Dictionary
    Dim i, j

    Dim ws1_range As Range
    Dim rng1 As Range, rng2 As Range

    With ws1

        Set ws1_range = .Range(Cells(2, 1).Address & ":" & Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 1).Address)

    End With

    Set family_dict = New Dictionary

    For Each rng1 In ws1_range
        If Not family_dict.Exists(Key:=ws1.Cells(rng1.Row, 1).Value2) Then
            Set bm_dict = New Dictionary
            For Each rng2 In ws1_range
                    If rng2 = rng1 Then
                    If Not bm_dict.Exists(Key:=ws1.Cells(rng2.Row, 2).Value2) Then
                        bm_dict.Add Key:=ws1.Cells(rng2.Row, 2).Value2, Item:=Empty
                    End If
                End If
            Next
            family_dict.Add Key:=ws1.Cells(rng1.Row, 1).Value2, Item:=bm_dict
            Set bm_dict = Nothing
        End If
    Next
'---test---immediate window on---
            For Each i In family_dict.Keys: Debug.Print i: For Each j In family_dict(i): Debug.Print j: Next: Next
End Sub

【讨论】:

    【解决方案2】:

    字典词典:


    后期绑定很慢CreateObject("Scripting.Dictionary")

    早期绑定很快:VBA 编辑器 -> 工具 -> 参考 -> 添加 Microsoft Scripting Runtime


    Option Explicit
    
    Public Sub nestedList()
        Dim ws As Worksheet, i As Long, j As Long, x As Variant, y As Variant, z As Variant
        Dim itms As Dictionary, subItms As Dictionary   'ref to "Microsoft Scripting Runtime"
    
        Set ws = Worksheets("Sheet1")
        Set itms = New Dictionary
    
        For i = 2 To ws.UsedRange.Rows.Count
    
            Set subItms = New Dictionary         '<-- this should pick up a new dictionary
    
            For j = 2 To ws.UsedRange.Columns.Count
    
                '           Key: "Property 1",          Item: "A"
                subItms.Add Key:=ws.Cells(1, j).Value2, Item:=ws.Cells(i, j).Value2
    
            Next
    
            '        Key: "Item 1",              Item: subItms
            itms.Add Key:=ws.Cells(i, 1).Value2, Item:=subItms
    
            Set subItms = Nothing                '<-- releasing previous object
    
        Next
        MsgBox "Row 5, Column 4:   --->   " & itms("Row 5")("Column 4")
    End Sub
    

    【讨论】:

    • 您好,保罗,感谢您的帮助。根据您的输入,我最终得到了编辑后的结果。非常感谢。
    猜你喜欢
    • 2012-01-22
    • 2020-12-15
    • 2011-05-18
    • 1970-01-01
    • 2016-12-21
    • 2021-10-17
    • 2018-09-28
    • 1970-01-01
    相关资源
    最近更新 更多