看到这个标题,相信读者肯定非常不屑的任务我在故弄玄虚,客官莫急,我说说你听听,肯定会有新故事。

字典对象是VBA中常用的对象之一,对于这种这种对象通常用两种绑定方式:前期绑定和后期绑定。
前期绑定需要在VBE中先引用相关扩展库,前期绑定的优势在于书写代码时可以智能提升相关属性和方法。
后期绑定使用CreateObject函数创建相关对象,后期绑定的优势在于,代码发布给用户后,用户无需引用相关扩展库,就可以直接运行代码。

两个方法各有利弊,没有优劣之分,通常在对象使用时是相同的,但是也有例外,今天要讲的就是字典对象在前期绑定和后期绑定两种方式中的不同表现。


示例1:后期绑定 - For Each遍历Keys

Sub DEMO1()
    Dim dic As Object
    Set dic = CreateObject("scripting.dictionary")
    For i = 1 To 3
        dic(i) = i
    Next
    For Each d In dic.Keys:
        Debug.Print d, dic(d)
    Next
End Sub

【代码解析】
第3行代码使用CreateObject创建字典对象。
第4~6行代码循环添加字典键值。
第7~9行代码循环遍历字典对象。
第7行代码使用For Each循环遍历字典对象的Keys集合。
第8行代码中d为字典对象的键,dic(d)为字典对象对应的值。


示例2:后期绑定 - For遍历Keys,Items

Sub DEMO2()
    Dim dic As Object
    Set dic = CreateObject("scripting.dictionary")
    For i = 1 To 3
        dic(i) = i
    Next
    For i = 0 To dic.Count - 1
        Debug.Print dic.Keys(i), dic.Items(i) '运行时错误451
    Next i
End Sub

【代码解析】
第7~9行代码与示例略有不同。
第7行代码中dic.Count返回值为字典对象中键值对的个数。
第8行代码使用索引值引用集合中的对象,这也是常用方法之一,但是此处会出现运行时错误451。


示例3:前期绑定 - For遍历Keys,Items
运行示例代码前需要引用“Microsoft Scripting Runtime”扩展库。

Sub DEMO3()
    Dim dic As Scripting.Dictionary
    Set dic = CreateObject("scripting.dictionary")
    For i = 1 To 3
        dic(i) = i
    Next
    For i = 0 To dic.Count - 1
        Debug.Print dic.Keys(i), dic.Items(i)
    Next i
End Sub

此代码完全可以正常运行。


示例4:后期绑定 - For遍历Keys,Items

Sub DEMO4()
    Dim dic As Object
    Set dic = CreateObject("scripting.dictionary")
    For i = 1 To 3
        dic(i) = i
    Next
    For i = 0 To dic.Count - 1
        Debug.Print dic.Keys()(i), dic.Items()(i)
    Next i
End Sub

【代码解析】
后期绑定也可以使用For循环,只是和通常的写法略有不同,第8行代码可以正常运行。


今天讲解就都这里,看似不起眼的小知识,如果大家遇到的话,可能会花费很多时间去解决代码错误,希望对大家有帮助。