【原创】VBA学习笔记(18)----VBA的 字典,以及比较enum array dictionary
一 比较三种数据类型
- enum 枚举型,数值类型 eNum
- array 数组
- dictionary 字典
Public Enum w1
week1
week2
week3
week4
End Enum
Sub t4()
Dim x As w1
x = week3
Debug.Print x
End Sub
二 数组
见前文
三 字典 dictionary ---是key-item形式(其他语言key-value)
学习参考资源
http://www.cnblogs.com/wuzhiblog/p/vba_two.html
https://www.jianshu.com/p/d36a0b907883
这个图也是参考的别人的
3.1 字典的定义
- 字典据说有两种定义方式
- 方案1:
- Dim dict_A As New dictionary---------实际不好使?
- 方案2
- Dim dict_A As Object
- Set dict_A = CreateObject("scripting.dictionary")
牵扯出一个问题
- dictionary 是对象 object
- 但是为什么不能通过 new dictionary出?因为没有 dictionary这种类?
- dim dictA as object 应该可以省略为 dim dict_A 因为所有默认的内容,默认都创建为 object? python是这样
3.2 字典的方法
和python的不同
- python的字典,使用的是 key value ,而items表示一对数据(key value)
- VBA里只有 key item--实际表示是value
- 好用的
- dict_A.add (key, item) ' item如果不是变量,是字符串应该 '' 括起来
- dict_A.exists (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
- 不好用的
- dict_A.keys '返回的是一个数组,下标默认从0开始
- dict_A.items '返回的是一个数组,下标默认从0开始
- 实测,必须用变量倒一下手,先把这个数组存到一个变量里,然后引用那个变量名当数组名才可以
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
为什么报错:property let 过程未定义
Rem Debug.Print dict_keys(0) 直接写就报错。??
原来前面要放个变量 如果加载scrrun.dll 可以不放变量 运行d.keys.(1)
http://club.excelhome.net/thread-890243-1-1.html
3.3 字典的属性
- 实测这几个属性好用
- dict_A.count
- dict_A.key(key) =xx '改变key
- dict_A.item(key) =xx '改变item
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
四 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