关于结构化数据类型,我们已经讨论过用户定义类型(UDT)、数组、集合,今天讨论最后一个——字典(dictionary)。与其他几种结构化数据类型不同,字典不是 VBA 内置的数据类型,使用字典类型必须添加对 Microsoft Scripting Runtime 的引用,如下图:图1 引用 Microsoft Scripting Runtime前面讨论过的集合只具有最基本的字典操作能力,Dictionary 则不同,这是一个全功能的字典类型。下面还是通过例子来具体感受 Dictionary 的能力。Dim dict As New DictionaryDim v As Variantdict.Add "Name", "Musk"dict("Job") = "Tesla CEO"If dict.Exists("Name") Then Debug.Print "Hello, " & dict("Name")End Ifdict("Job") = dict("Job") & " & SpaceX CEO"dict.Key("Job") = "Title"Debug.Print dict("Name") & "'s titles are " & dict("Title")
所谓字典,就是一个由多个元素组成的集合(collection,这里说的集合是一个通用概念,不是 VBA 的集合数据类型,所以用小写的 collection 表示),每个元素都由键/值(Key/Item)对组成。所以,也可以这样认为,所谓字典就是一个由键到值的对照表(key-item mapping table)。字典的重要意义就在于由键快速访问对应的值。当然,访问字典的前提是字典中含有要访问的内容。所以字典操作的首要任务是向字典中添加元素。- Add 方法:dict.Add key, item
- 如果 key 不存在,则添加 key/item 元素
- 如果 key 不存在,则添加 key/item 元素
- 如果 Key 已存在,则将 key 的值更新为 item
- 如果 key 不存在,则将 key/空值 加入字典,返回 key 对应的空值
- 如果 key 已存在,则返回 key 对应的 item
- 如果 key 不存在,相当于添加元素 key/item
- 如果 key 已存在,则将 key 的值更新为 item
- 如果 key 已存在,但 newKey 也存在,则更新失败
- 如果 Key 已存在,但 newKey 不存在,则 key 更新为 newKey
- 如果 key 已存在,则删除 key/item 元素
- dict.Keys:返回字典中所有 key 组成的数组
- dict.Items:返回字典中所有 item 组成的数组
Dim dict As New DictionaryDim myA() As VariantDim i As IntegerDim v As Variantdict.Add("Name") = "Musk"dict("Title") = "Tesla CEO & SpaceX CEO"myA = dict.KeysFor i = 0 to dict.Count - 1 Debug.Print myA(i)Next iFor Each v indict.Keys Debug.Print vNext vmyA = dict.ItemsFor i = 0 to dict.Count - 1 Debug.Print myA(i)Next iFor Each v indict.Items Debug.Print vNext v
因为 Keys 和 Items 都是返回变体类型(Variant)的数组,所以枚举数组元素可以使用 For ... Next 循环,也可以使用 For Each ... Next 循环。一般来说使用 For Each ... Next 结构效率要高一点。