【原创】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

【原创】VBA学习笔记(18)----VBA的 字典,以及比较enum array dictionary

 

二 数组

见前文

 

 

三 字典 dictionary ---是key-item形式(其他语言key-value)

 

学习参考资源

http://www.cnblogs.com/wuzhiblog/p/vba_two.html

https://www.jianshu.com/p/d36a0b907883

这个图也是参考的别人的

【原创】VBA学习笔记(18)----VBA的 字典,以及比较enum array dictionary

 

 

 

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

【原创】VBA学习笔记(18)----VBA的 字典,以及比较enum array dictionary

 

 

  • 不好用的
  • 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