Позднее связывание или раннее связывание со встроенными документами Word
У меня проблемы с загрузкой встроенного документа на более старую версию MS Office. Я полагаю, что проблема заключается в том, как я объявляю свои объекты, но я не уверен, как объявить мои встроенные документы с использованием позднего связывания (я все еще очень плохо знаком как с этой концепцией, так и с vba). Ниже показано, как я сейчас делаю объявление переменной вместе с фрагментом кода. Он отлично работает в Excel 2013, но не работает в 2010 году из-за того, как я объявил свои переменные (я считаю).
Dim oDoc As Word.Document
Dim oTemplate As Word.Document
Dim wdObj As OLEObject
Dim wdObj2 As OLEObject
'Deselect anything selected
Range("A1").Select
'Copy content of template
Set wdObj = Sheets("Template").OLEObjects("Template")
wdObj.Activate
Set oTemplate = wdObj.Object
oTemplate.Content.Copy
'Initialize letter document
Set wdObj2 = Sheets("Report").OLEObjects("Letter")
wdObj2.Activate
Set oDoc = wdObj2.Object
'Erase contents and replace with clean template
oDoc.Content.Delete
oDoc.Range.PasteAndFormat _
wdFormatOriginalFormatting
Я пытался установить oDoc и oTemplate для них "Как объект", но я не уверен, как связать их обратно с текстовым объектом. Это просто привело к сбою ссылки на библиотеку при вызове PasteAndFormat "wdFormatOriginalFormatting".
Я рвал на себе волосы, пытаясь понять это. Любая помощь будет принята с благодарностью. Спасибо!
2 ответа
Во-первых, убедитесь, что вы используете Option Explicit
в модуле кода. Затем, когда вы пытаетесь скомпилировать, он должен предупредить вас о проблеме с wdFormatOriginalFormatting
,
Зачем?
wdFormatOriginalFormatting
является перечисляемой константой в объектной модели Word. Он не существует в Excel, если вы не используете раннее связывание.
Решение
Когда вы используете позднюю привязку, вам нужно объявить и присвоить значения этим константам, так как они не известны иначе во время компиляции или во время выполнения:
Const wdFormatOriginalFormatting as Long = 16
Тогда эта строка не должна вызывать ошибку:
oDoc.Range.PasteAndFormat _
wdFormatOriginalFormatting
С поздним связыванием вы не можете использовать какие-либо предопределенные константы раннего связывания на момент Dim
неизвестно, какой объект вы имеете в виду (это преимущество раннего связывания) ... с другой стороны, вам не нужно создавать ссылки на библиотеки.
Теперь для связывания объекта OLE (Word) обратно с объектом Document...
Со встроенными объектами вы идете наоборот: обычно вы сначала создаете / открываете приложение, затем документ в приложении... здесь мы используем глагол OLE, чтобы сразу открыть встроенный документ, а затем перехватить приложение...
Sub LateBinding()
Dim WApp As Object
Dim wdobj As Object
Dim wdOLE As OLEObject
' create a reference to the OLE object
Set wdOLE = ActiveSheet.OLEObjects(1)
' open the OLE object using its application (whatever that is)
wdOLE.Verb xlVerbPrimary
' create a reference to the real object inside the OLE object
Set wdobj = wdOLE.Object
' create a reference to the application used by wdobj
Set WApp = wdobj.Application
' start using the application ... let's move the cursor a bit
' hoping it is REALLY a WORD type of object ... we could test that before of course
' note we cannot use predefined WORD constants here, hence Unit and Count
WApp.Selection.MoveDown Unit:=5, Count:=1
End Sub
теперь объект OLE связан (назад) с реальным объектом документа и (назад) с его приложением.
Надеюсь, это то, что вы хотели знать...