早期结合与晚期结合

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

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

  • 在运行期间,早期绑定在操作上比后期绑定更快。在运行时使用后期绑定创建对象需要花费时间,以便在最初加载 VBA 项目时完成早期绑定。
  • 早期绑定通过按顺序位置识别 Key / Item 对来提供额外的功能。
  • 根据代码结构,早期绑定可以提供额外级别的类型检查并减少错误。
  • 键入绑定对象的属性和方法时,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.Add Key:="Red", Item:="Balloon"
    dict.Add Key:="Green", Item:="Balloon"
    dict.Add Key:="Blue", Item:="Balloon"
    
    'iterate through the keys
    For Each k In dict.Keys
        Debug.Print k & " - " & 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.Add Key:="Red", Item:="Balloon"
    dict.Add Key:="Green", Item:="Balloon"
    dict.Add Key:="Blue", Item:="Balloon"
    dict.Add Key:="White", Item:="Balloon"
    
    'iterate through the keys
    For Each k In dict.Keys
        Debug.Print k & " - " & dict.Item(k)
    Next k

    'iterate through the keys by the count
    For d = 0 To dict.Count - 1
        Debug.Print dict.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.Print dict.Keys(d) & " - " & dict.Items(d)
    Next d
    
    dict.Remove "blue"                         'remove individual key/item pair by key
    dict.Remove dict.Keys(0)                   'remove first key/item by index position
    dict.Remove dict.Keys(UBound(dict.Keys))   'remove last key/item by index position
    dict.RemoveAll                             'remove all remaining key/item pairs

End Sub

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

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

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