1字典 dictionary (key-item形式)

 

1.1字典的前期绑定

前期绑定的方法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 字典的基础方法和属性

这个图是参考的别人的

 

vba vlookup的字典多item vba多个字典_数组

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

vba vlookup的字典多item vba多个字典_数组_02

 

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