1字典 dictionary (key-item形式)
1.1字典的前期绑定
- 首先需要,先加载库文件 工具--添加-- scrrun.dll,否则无法前期绑定
- 参考方法:http://www.360doc.com/content/19/0629/17/30583536_845611094.shtml
- 先点 工具--引用---浏览 找到scrull.dll
- 然后在 工具--引用---找到 microsoft--scripting--runtime
前期绑定的方法1
- Dim dict3 As dictionary
- Set dict3 = New dictionary
前期绑定方法2
- Dim dict2 As New dictionary
1.2 字典的后期绑定
- Set dict1 = CreateObject("scripting.dictionary")
1.3 两种方法的比较
1.3.1 前期绑定好处
- 前期绑定好用(提示多,引用方式也灵活)
- 坏处是,如果VBA代码发给其他人运行,其他人也需要配置一遍环境
- 前期绑定,可以随便用
- dict1.keys(i)
- dict1.items(i)
1.3.2 后期绑定好处
- 后期绑定实用(不会因为使用者未引用相应项目而出错,相对来讲更适于代码传播)
- 没有 dict的方法/属性 提示,因为没有加载对应的库文件
- 后期绑定最大的不方便,还在于不能随便用
- dict1.keys(i) 或 dict1.items(i)
- 但是用数组倒手一下就可以了
- arr2=dict1.keys(i) 或 arr2= dict1.items(i)
- 但是可以直接用这个整体
- dict1.keys() 或 dict1.items()
1.4 字典的特点:
- key是唯一的,不会重复 (但是item可以重复)
- 数组为了去重复,经常会利用dict的这个特点。
2 字典的基础方法和属性
这个图是参考的别人的
2 字典的方法和属性
2.1 测试代码
- 有奇效的 dict1(333)
- 如果没有这个key 会自动加一对key item : key ""
Sub test_dict()
Dim dict1 As Object
Set dict1 = CreateObject("scripting.dictionary")
'后期绑定
Dim dict2 As New dictionary
'前期绑定
Dim dict3 As dictionary
Set dict3 = New dictionary
'前期绑定
'添加key-item 需要成对添加
dict1.Add 1, "10"
dict1.Add 2, "11"
dict1.Add 3, "12"
'dict1.Add 3, "12" '重复add会报错
'dict1.Add (10, "100") '错误写法
'改变item / 给item改变赋值
Debug.Print "dict1(1)=" & dict1(1)
dict1(1) = "abc"
dict1.Item(3) = "def"
Debug.Print "dict1(1)=" & dict1(1)
Debug.Print "dict1(3)=" & dict1(3)
Debug.Print
'改变key
'key可以改变
'key但并不好直接显示出来
Debug.Print "dict1.Key(2)=" & dict1.Item(2)
dict1.Key(2) = 222
Debug.Print "dict1.Key(222)=" & dict1(222)
'只能判断key是否存在?不能判断item? 因为key唯一?
Debug.Print dict1.exists(222)
Debug.Print dict1.exists("222")
dict1.Add "222", "这个key222不是那个222"
Debug.Print dict1.Item("222")
Debug.Print
'dict.exists(key) 没有也不会添加新值
'dict(key) 如果没有会添加新key-""
Debug.Print "dict1.Count=" & dict1.Count
Debug.Print dict1.exists(333)
Debug.Print "exists后,dict1.Count=" & dict1.Count
Debug.Print dict1(333)
Debug.Print "dict1(key)之后,如果没有,dict1.Count=" & dict1.Count
Debug.Print
'dict的count,是数的一对key-item的数量
'dict的remove removeall
Debug.Print "dict1.Count=" & dict1.Count
Debug.Print dict1.Remove(222)
Debug.Print "remove后 dict1.Count=" & dict1.Count
Debug.Print
'dict的2个默认数组
Debug.Print "dict1.keys()=";
For Each I In dict1.keys()
Debug.Print I & "|";
Next
Debug.Print
Debug.Print "dict1.items()=";
For Each J In dict1.items()
Debug.Print J & "|";
Next
Debug.Print
Debug.Print dict1.Item(1)
Debug.Print "dict1()前 dict1.Count=" & dict1.Count
Debug.Print dict1("1")
Debug.Print dict1.Item("1")
Debug.Print "dict1()后 dict1.Count=" & dict1.Count
Debug.Print
End Sub
2.2 字典的方法
和python的不同
- python的字典,使用的是 key value ,而items表示一对数据(key value)
- VBA里只有 key item
- 添加 key,item
- dict_A.add key, item ' item如果不是变量,是字符串应该 '' 括起来
- dict_A.add (key, item) '错误写法
- dict_A.exists (key)
- dict_A.exist (key) 语法警告,exist() 是错误的,带s
- dict_A.remove (key)
- 实测发现,remove之后,这个key仍在,只是item值为空了,仍然是 exist的!
- dict_A.removeall 用法和效果同remove,也是key对应的item虽然空,但仍然exist
Sub t5()
Rem Dim dict_A As New dictionary
Dim dict_A As Object
Set dict_A = CreateObject("scripting.dictionary")
dict_A.Add 1, "python"
dict_A.Add 2, "VBA"
dict_A.EXISTS (1)
dict_A.Remove (2)
Debug.Print (dict_A(1))
Debug.Print (dict_A(2))
Debug.Print (dict_A.EXISTS(1))
Debug.Print (dict_A.EXISTS(2))
Debug.Print (dict_A.EXISTS(3))
End Sub
Sub t5()
Rem Dim dict_A As New dictionary
Dim dict_A As Object
Set dict_A = CreateObject("scripting.dictionary")
dict_A.Add 1, "python"
dict_A.Add 2, "VBA"
Rem Debug.Print dict_keys(0) 直接写就报错。??
keys_A = dict_A.keys
Debug.Print keys_A(0)
items_A = dict_A.items
Debug.Print items_A(1)
End Sub
3 字典的属性
- dict_A.count
- dict_A.key(key) =xx '改变key
- dict_A.item(key) =xx '改变item,赋值
- dict_A(key)=xxx
Sub t5()
Rem Dim dict_A As New dictionary
Dim dict_A As Object
Set dict_A = CreateObject("scripting.dictionary")
dict_A.Add 1, "python"
dict_A.Add 2, "VBA"
Debug.Print (dict_A.Count)
dict_A.Key(1) = 999
Debug.Print dict_A(999)
dict_A.Item(2) = "bat"
Debug.Print dict_A(2)
End Sub
4 dictionary 的 comparemode
- 指定dictionary 后面操作方法和属性时,基于的模式
- 比如如果选择 vbtextCompare 那么就按文本比较,不区分大小写
comparemode的几种值
- VbUseCompareOption(-1): 使用Option Compare语句的设置值进行比较;
- vbBinaryCompare(0): 进行二进制比较;
- vbTextCompare(1): 进行文字比较;
- vbDatabaseCompare 2 仅用于 Microsoft Access。进行基于您自己数据库中信息的比较。
Sub t5()
Rem Dim dict_A As New dictionary
Dim dict_A As Object
Set dict_A = CreateObject("scripting.dictionary")
dict_A.comparemode = 1
dict_A.Add "a", "python"
dict_A.Add "b", "VBA"
dict_A.Add "B", "bat" '报错,告诉你,该关键字已经关联到一个元素上了
'因为 b 和 B 被认为是同一个关键字了
End Sub
参考
https://www.jianshu.com/p/d36a0b907883