Позднее связывание означает, что VBA знает только время выполнения о соответствующих типах. Это поздно:
Dim PowerPointA As Object
Это объявление будет компилироваться с указанием библиотеки типов PowerPoint
или без нее.
Поскольку VBA не знает (не может) знать, какие члены PowerPointA
имеют, вы не получите IntelliSense во время разработки, и это с радостью скомпилируется ...
PowerPointA.SomeMemberThatDoesNotExist
... и взорвать во время выполнения с ошибкой 438 «Объект не поддерживает это свойство или метод».
Любой вызов участника, сделанный против Object
или Variant
, имеет позднюю привязку; во время выполнения VBA необходимо запросить интерфейс, чтобы определить местонахождение члена и определить его существование: это означает, что код с поздней привязкой влечет за собой небольшую нагрузку, которая не требуется для кода с ранней привязкой.
Раннее связывание означает, что VBA обладает знаниями во время компиляции соответствующих типов. Это рано:
Dim PowerPointA As PowerPoint.Application
Это объявление может быть скомпилировано только при обращении к библиотеке типов PowerPoint
.
Поскольку VBA знает, какие элементы есть у PowerPointA
, вы получаете IntelliSense (и автозаполнение) во время разработки, и это будет , если не скомпилируется:
PowerPointA.SomeMemberThatDoesNotExist
... однако Application
- это, вероятно, расширяемый COM-интерфейс (Excel.Application
is); если это так, тогда VBA скомпилирует код, и SomeMemberThatDoesNotExist
будет вызовом с поздней привязкой, который будет взорван во время выполнения с ошибкой 438 «Объект не поддерживает это свойство или метод».
Когда вы хотите «преобразовать код с ранней привязкой в код с поздней привязкой», вы действительно имеете в виду, что вы хотите удалить ссылку на библиотеку типов из вашего проекта и при этом иметь возможность компилировать и запускать код .
Предполагая, что ссылка является библиотекой типов PowerPoint
, это означает, что вам нужно заменить все в своем коде, который определен в этой библиотеке - потому что, как только вы удалите ссылку, классы, такие как PowerPoint.Application
, PowerPoint.Presentation
, PowerPoint.Slide
и PowerPoint.Shape
больше не будут определяться, и перестанут что-либо значить для VBA. Поэтому:
- Заменить декларации
As [PowerPoint.][ClassName]
на As Object
- Заменить
New [PowerPoint.][ClassName]
на CreateObject("ProgIdForThatClass")
- Удалить ссылку на библиотеку типов
PowerPoint
- Скомпилируйте проект. Не компилируется? Вернуться к 1.
ProgId
для PowerPoint.Application
бывает "PowerPoint.Application"
, так что вы можете заменить это:
Set PowerPointA = New PowerPoint.Application
С этим:
Set PowerPointA = CreateObject("PowerPoint.Application")
И это все, что вам нужно сделать.
Если в другом месте есть код, который ссылается на константы, определенные в библиотеке типов PowerPoint
, вам нужно либо заменить их на их базовое значение, либо определить эквивалентные константы самостоятельно, поэтому вместо этого:
foo = ppEffectFade
У вас будет это:
foo = 1793 'PowerPoint.PpEntryEffect.ppEffectFade=1793
или это:
Const ppEffectFade As Long = 1793
foo = ppEffectFade
Или это:
Public Enum PpEntryEffect
ppEffectAppear = 3844
ppEffetFade = 1793
'...
End Enum
foo = ppEffectFade
Вы можете найти все константы, их значения и все, что определено в любой библиотеке ссылочных типов, используя Object Browser ( F2 ):