早期結合與晚期結合

繫結是將物件分配給識別符號或變數名稱的過程。早期繫結(也稱為靜態繫結)是指在 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 和物件瀏覽器。