Поиск…


Ранняя привязка против поздней привязки

Связывание - это процесс назначения объекта идентификатору или имени переменной. Раннее связывание (также известное как статическое связывание) - это когда объект, объявленный в Excel, имеет определенный тип объекта, такой как рабочий лист или рабочая книга. Позднее связывание происходит при создании общих ассоциаций объектов, таких как типы объявлений Object и Variant.

Раннее связывание ссылок имеет некоторые преимущества перед поздним связыванием.

  • Раннее связывание оперативно быстрее, чем позднее связывание во время выполнения. Создание объекта с поздним связыванием во время выполнения требует времени, которое раннее связывание выполняется, когда проект VBA изначально загружается.
  • Раннее связывание предлагает дополнительную функциональность путем идентификации пар ключей / предметов по их порядковой позиции.
  • В зависимости от структуры кода раннее связывание может предложить дополнительный уровень проверки типов и уменьшить ошибки.
  • Коррекция капитализации VBE при вводе свойств и методов связанного объекта активна с ранней привязкой, но недоступна с поздним связыванием.

Примечание. Чтобы реализовать раннее связывание, вы должны добавить соответствующую ссылку на проект VBA с помощью команды «Инструменты» → «Ссылки» VBE.
Эта библиографическая ссылка затем переносится с проектом; ему не нужно повторно ссылаться, когда проект 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

Однако, если вы используете раннее связывание, и документ запускается в системе, в которой отсутствует одна из библиотек, на которую вы ссылались, вы столкнетесь с проблемами. Мало того, что подпрограммы, которые используют недостающую библиотеку, не работают должным образом, но поведение всего кода внутри документа станет неустойчивым. Вполне вероятно, что ни один из кодов документа не будет работать на этом компьютере.

Это то, где поздняя привязка выгодна. При использовании позднего связывания вам не нужно добавлять ссылку в меню «Инструменты»> «Ссылки». На машинах, имеющих соответствующую библиотеку, код будет работать. На машинах без этой библиотеки команды, ссылающиеся на библиотеку, не будут работать, но все остальные коды в вашем документе будут продолжать функционировать.

Если вы не знакомы с библиотекой, на которую вы ссылаетесь, может быть полезно использовать раннее связывание при написании кода, а затем перейти к позднему связыванию перед развертыванием. Таким образом, вы можете использовать возможности IntelliSense и обозревателя объектов VBE во время разработки.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow