excel-vba 早期绑定与后期绑定

例子

绑定是将对象分配给标识符或变量名的过程。早期绑定(也称为静态绑定)是指在Excel中声明的对象属于特定对象类型(例如工作表或工作簿)的情况。进行常规对象关联(例如Object和Variant声明类型)时,将发生后期绑定。

与后期绑定相比,引用的早期绑定具有一些优势。

  • 在运行时,早期绑定在操作上比后期绑定要快。在运行时创建具有后期绑定的对象需要花费时间,而最初加载VBA项目时,要完成早期绑定。

  • 早期绑定通过按键/项对的顺序位置标识来提供其他功能。

  • 根据代码结构,早期绑定可以提供更高级别的类型检查并减少错误。

  • 键入绑定对象的属性和方法时,VBE的大写更正在早期绑定时有效,而在后期绑定中不可用。

注意:必须通过VBE的“工具”→“引用”命令将适当的引用添加到VBA项目,以实现早期绑定。
然后,该库引用随项目一起提供。在分发VBA项目并在另一台计算机上运行时,不必重新引用它。

'Looping through a dictionary that was created with late binding¹
Sub iterateDictionaryLate()
    Dim k As Variant, dict As Object
    
    Set dict = CreateObject("Scripting.Dictionary")
   dict.comparemode= vbTextCompare          'non-case sensitive compare model
    
    'populate the dictionary
   dict.AddKey:="Red", Item:="Balloon"
   dict.AddKey:="Green", Item:="Balloon"
   dict.AddKey:="Blue", Item:="Balloon"
    
    'iterate through the keys
    For Each k In dict.Keys
       Debug.Printk & " - " & dict.Item(k)
    Next k
    
   dict.Remove"blue"      'remove individual key/item pair by key
   dict.RemoveAll         'remove all remaining key/item pairs

End Sub

'Looping through a dictionary that was created with early binding¹
Sub iterateDictionaryEarly()
    Dim d As Long, k As Variant
    Dim dict As New Scripting.Dictionary
    
   dict.CompareMode= vbTextCompare          'non-case sensitive compare model
    
    'populate the dictionary
   dict.AddKey:="Red", Item:="Balloon"
   dict.AddKey:="Green", Item:="Balloon"
   dict.AddKey:="Blue", Item:="Balloon"
   dict.AddKey:="White", Item:="Balloon"
    
    'iterate through the keys
    For Each k In dict.Keys
       Debug.Printk & " - " & dict.Item(k)
    Next k

    'iterate through the keys by the count
    For d = 0 Todict.Count- 1
       Debug.Printdict.Keys(d) & " - " & dict.Items(d)
    Next d
    
    'iterate through the keys by the boundaries of the keys collection
    For d = LBound(dict.Keys) To UBound(dict.Keys)
       Debug.Printdict.Keys(d) & " - " & dict.Items(d)
    Next d
    
   dict.Remove"blue"                         'remove individual key/item pair by key
   dict.Removedict.Keys(0)                   'remove first key/item by index position
   dict.Removedict.Keys(UBound(dict.Keys))   'remove last key/item by index position
   dict.RemoveAll                            'remove all remaining key/item pairs

End Sub

但是,如果使用的是早期绑定,并且文档在缺少引用的库之一的系统上运行,则会遇到问题。利用缺少的库的例程不仅不能正常运行,而且文档中所有代码的行为也将变得不稳定。该文档的代码很可能都无法在该计算机上运行。

这是后期绑定比较有利的地方。使用后期绑定时,不必在“工具”>“参考”菜单中添加参考。在具有适当库的计算机上,代码仍将起作用。在没有该库的机器上,引用该库的命令将不起作用,但是文档中的所有其他代码将继续起作用。

如果您不完全熟悉所引用的库,则在编写代码时使用早期绑定,然后在部署之前切换到后期绑定可能会很有用。这样,您可以在开发过程中利用VBE的IntelliSense和对象浏览器。