VBA有字典结构吗?比如key<>value array?


当前回答

脚本运行时字典似乎有一个bug,可能会在高级阶段破坏您的设计。

如果字典值是数组,则不能通过对字典的引用更新数组中包含的元素的值。

其他回答

是的。适用于VB6, VBA (Excel), VB。网

脚本运行时字典似乎有一个bug,可能会在高级阶段破坏您的设计。

如果字典值是数组,则不能通过对字典的引用更新数组中包含的元素的值。

Yes.

设置对MS脚本运行时('Microsoft脚本运行时')的引用。根据@regjo的评论,转到工具->参考,并勾选“微软脚本运行时”。

使用下面的代码创建一个字典实例:

Set dict = CreateObject("Scripting.Dictionary")

or

Dim dict As New Scripting.Dictionary 

使用示例:

If Not dict.Exists(key) Then 
    dict.Add key, value
End If 

当你用完字典时,别忘了把它设置为Nothing。

Set dict = Nothing 

VBA没有字典的内部实现,但是在VBA中你仍然可以使用MS Scripting Runtime Library中的字典对象。

Dim d
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "aaa"
d.Add "b", "bbb"
d.Add "c", "ccc"

If d.Exists("c") Then
    MsgBox d("c")
End If

你可以通过System.Collections.HashTable访问一个非本地哈希表。

哈希表

表示基于的键/值对的集合 键的哈希码。

不确定你会想要使用这个脚本。字典,但在这里添加为完整起见。你可以回顾这些方法,如果有一些感兴趣的,例如克隆,CopyTo

例子:

Option Explicit

Public Sub UsingHashTable()

    Dim h As Object
    Set h = CreateObject("System.Collections.HashTable")
   
    h.Add "A", 1
    ' h.Add "A", 1  ''<< Will throw duplicate key error
    h.Add "B", 2
    h("B") = 2
      
    Dim keys As mscorlib.IEnumerable 'Need to cast in order to enumerate  'https://stackoverflow.com/a/56705428/6241235
    
    Set keys = h.keys
    
    Dim k As Variant
    
    For Each k In keys
        Debug.Print k, h(k)                      'outputs the key and its associated value
    Next
    
End Sub

@MathieuGuindon的回答给出了很多关于HashTable的细节,以及为什么需要使用mscorlib。IEnumerable(早期绑定到mscorlib的引用),以便枚举键:值对。