【问题标题】:vba can i put a collection inside a scripting.dictionaryvba 我可以在 scripting.dictionary 中放置一个集合吗
【发布时间】:2016-05-28 10:56:09
【问题描述】:

我正在尝试创建一个集合并放入其中

mydict = my_key:["a", "b", "c"]

然后迭代。

    For Each V In mydict.keys
        Debug.Print V
        for z in mydict.Item(V)       
            Debug.Print  z
        next z
    Next V

输出应该看起来像 我的钥匙 一种 b c

但我遇到了问题和错误,是否可以将集合存储在 scripting.dictionary 中?

或者只是存储诸如“my_key”:“a”,“my_key2”:“b”之类的字符串?

谢谢。

【问题讨论】:

    标签: vba dictionary collections


    【解决方案1】:

    将集合放入字典中是 VBA 中的一个有趣问题。更有趣的是,当我们事先不知道键和值的数量时。假设这是我们在 Excel 中的输入:

    在即时窗口中请求的输出如下所示Ctrl+G:

    这是可以交付它的代码(运行Main):

    Public Sub Main()
    
        Dim teamDictionary As New Dictionary
        fillTeamDictionary teamDictionary
    
        Dim myKey As Variant
        Dim myVals As Variant
    
        For Each myKey In teamDictionary
            Debug.Print myKey; ":"
            For Each myVals In teamDictionary(myKey)
                Debug.Print vbTab; myVals
            Next
            Debug.Print "----------------"
        Next
    
    End Sub
    
    Public Sub fillTeamDictionary(teamDictionary As Dictionary)
    
        Dim myCell As Range
        Dim teamRange As Range
    
        With tblTeam
            Set teamRange = .Range("A1:A8") 'range could be flexible...
        End With
    
        Dim myKey As String
        Dim myVal As String
    
        For Each myCell In teamRange
            myKey = myCell
            myVal = myCell.Offset(ColumnOffset:=1)
    
            If teamDictionary.Exists(myKey) Then
                teamDictionary(myKey).Add (myVal)
            Else
                Dim newList As Collection
                Set newList = New Collection
                newList.Add (myVal)
                teamDictionary.Add myKey, newList
            End If
        Next myCell
    
    End Sub
    

    “诀窍”是在每次需要时为字典的每个唯一键初始化一个新的 Collection:

    Dim newList As Collection
    Set newList = New Collection
    newList.Add (myVal)
    teamDictionary.Add myKey, newList
    

    然后添加到集合中,只要键存在:

    If teamDictionary.Exists(myKey) Then
        teamDictionary(myKey).Add (myVal)
    

    【讨论】:

      【解决方案2】:

      要将集合存储在字典中,您可以使用两步过程,首先创建集合,然后将其添加到字典中:

      Sub test()
          Dim C As Collection
          Dim D As Object
          Dim v As Variant
      
          Set D = CreateObject("Scripting.Dictionary")
      
          Set C = New Collection
          C.Add "a"
          C.Add "b"
          C.Add "c"
      
          D.Add "key1", C
      
          Set C = New Collection 'Old collection safely stored in D
          D.Add "key2", C 'Now D("key2") holds a collection
          D("key2").Add "d"
          D("key2").Add "e"
      
          Debug.Print "Collection for key1:"
          For Each v In D("key1")
              Debug.Print v
          Next v
      
          Debug.Print "Collection for key2:"
          For Each v In D("key2")
              Debug.Print v
          Next v
      
      End Sub
      

      代码说明了如何添加回收集合变量C 以添加多个集合,以及如何将空集合添加到字典中以供以后修改。

      输出:

      Collection for key1:
      a
      b
      c
      Collection for key2:
      d
      e
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 2012-01-03
        • 2012-01-22
        • 2022-01-08
        • 1970-01-01
        相关资源
        最近更新 更多