字典的索引(keys)不能重复,常用字典来去重,字典是一个二维数组,其中keys不重复,每个keys对应一个值(item),值可以重复。vba中常用字典代替vlookup。

'字典学习
 
'声明本模块中默认的比较方式,只能是text或者binary;如果不声明的的话,默认为二进制比较,但是对VBA字典中的比较方式没有影响。。
'Option Compare Text    '文本比较,不区分大小写;例如:"a" =  "A" 会返回true;
'Option Compare Binary  '系统默认的比较方式,二进制比较,区分大小写;例如: "a" =  "A" 会返回false,"a" > "A" 会返回true。
 
Sub 字典学习()
'00 综述
   '四个属性:comparemode,count,key,item
   '六个方法:add,exists,items,keys,remove,removeall
   'key关键字
   'item项
 
'01 字典的引用方式
   '01 前端引用,需要先勾选字典脚本:工具-引用-Microsoft scripting runtime,然后才可以使用,程序迁移不方便;输入d.后会有下拉框提示
'   Dim d As New Dictionary
   '02 后端引用,不需要勾选字典脚本,程序迁移方便;输入d.后没有提示
   Dim d As Object
   Set d = CreateObject("scripting.dictionary")
 
'02 comparemode属性;设置比较方式。
'   d.CompareMode = -1               '使用 Option Compare 陈述式的设定进行比较。经测试VBA中不适用,不知VB中能不能用。
'   d.CompareMode = BinaryCompare    '或0;默认的比较方式;进行二进制比较,区分大小写
'   d.CompareMode = TextCompare      '或1;进行文本比较,不区分大小写
'   d.CompareMode = DatabaseCompare  '或2;仅用于 Microsoft Access。进行基于您自己资料库中资讯的比较。
 
'03 add方法;向字典中添加元素。
   On Error Resume Next
   For i = 1 To 4
        '要用range("a1").value格式输入域key和item;
        '如果不加.value,则字典的key为单元格,在进行输出的时候会出现错误;
        '例如:不加.value的时候,Debug.Print d.Item("a")会输出空值
        '也可以先把值装入数组,再从输入装入字典。类似:'arr = Range("a2:b" & i),然后让字典从数组中获取值,提高程序运行速度。
        d.Add Range("a" & i + 1).Value, Range("b" & i + 1).Value    '如果key已存在会报错
'        d(Range("a" & i + 1).Value) = Range("b" & i + 1).Value     '没有写add,效果同上;但是如果key已存在,会直接覆盖item,不会报错,相当于修改item值,所以这种写法较常用
   Next
   On Error GoTo 0
'   MsgBox d.Item("a")
 
'04 count属性;统计字典中元素的个数
    j1 = d.Count
    Debug.Print j1
'05 key属性,用于修改key值
    d.Key("a") = "g"  'key属性用法,修改已有的key值,如果字典中没有待修改的key值,则会报错
    Debug.Print d.Item("g")   '输出结果为“苹果”
'    d.Key("e") = "h"
  
'06 item属性:
'    Debug.Print d.Item("g")   '输出key为"g"的项,对应的item值;
    d.Item("b") = "西红柿" '相当于d("b")= "西红柿";如果key值不存在,也相当于d.add("b") = "西红柿",存在的话,会报错。
    'd("b") 等于d.item("b")
    [G1] = d("b")
    [G2] = d.Item("b")
   
'07 exists判断一个key是否已经存在,返回布尔值,此方法最常用。
'    If d.Exists("a") = True Then xxx
 
'08 keys方法和items方法,一般用于把值输出到数组,进行进一步处理或输出
    arr = d.Keys
    brr = d.Items
    Range("e1:e4") = Application.Transpose(d.Keys)
    Range("f1:f4") = Application.Transpose(d.Items)
   
'09 remove方法,清除字典中的一条记录
    d.Remove ("b")
   
'10 removeall方法,清除字典中的所有元素
    d.RemoveAll 'removeall之后d仍然是字典对象
    Set d = Nothing '此操作完成后未赋值的object对象
End Sub

'11 总结
'字典一般用在去重,计数等方面,一定程度上代替函数中的vlookup,countif等
'一般先把数据装入数组,然后用字典进行去重和计数处理,其中主要会用到exists方法。
'然后进行其他操作,然后把值输入到单元格中,或者把数据输出到数组,再进一步输出到单元格中。
'最后把数组和字典set为noting以释放内存