Как установить переменную объекта Excel DocumentProperty (которая находится в функции ByRef) в элемент коллекции Word BuiltinDocumentProperties? - PullRequest
0 голосов
/ 04 января 2019

У меня была похожая проблема как у пользователя в этот вопрос .

Прямо сейчас я не могу получить свою переменную функции proDocName, которая имеет тип «DocumentProperty», для установки в wdDoc.BuiltinDocumentProperties.Item (1) в моем Excel VBA ниже. Выдает ошибку несоответствия типов.

Подпрограмма Excel VBA должна сначала открыть экземпляр слова, а затем открыть файл документа Word.

Затем я передаю ByRef файл (я называю его wdDoc в моем коде) функции, где я затем пытаюсь получить значения и имена свойств документа, которые я хочу записать в свой лист Excel, используя функцию.

Я проверил следующий код в Word VBA, который отлично работает:

Sub test()
Dim wdApp As Word.Application
Dim wdDocPro As DocumentProperty

Set wdApp = GetObject(, "Word.Application")
Set wdDoc = wdApp.ActiveDocument
Set wdDocPro = wdDoc.BuiltInDocumentProperties.Item(1) ' I get a type mismatch on this line

For Each wdDocPro In wdDoc.BuiltInDocumentProperties
MsgBox (wdDocPro.Name & " , " & wdDocPro.Value)

Next wdDocPro

End Sub

Этот тест позволил мне увидеть свойства документа "wdDoc", поэтому я знаю, что это должно быть проблемой либо с 1) объектной моделью Excel и Word для DocumentProperty, либо 2) функцией каким-то образом теряется доступ к Word .Document BuiltinDocumentProperties collection

У этого кода в Excel vba возникают проблемы, когда я добираюсь до строки, в которой я установил wdDocPro для элемента BuiltinDocumentProperties.

Public Sub GetCurrentFolderConstants()
Dim DocVariables() As String
Dim wdApp as Word.Application
Dim wdDoc as Word.Document

Set wdApp = GetObject(, "Word.Application")
Set wdDoc = wdApp.ActiveDocument

DocVariables = DocVarGrabbing(wdDoc)
'Do stuff

wdDoc.Close True
'Do stuff with DocVariables
wdApp.Quit SaveChanges:=False
End Sub



'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function DocVarGrabbing(ByRef wdDoc As Word.Document) As String()

Dim wdDocPro As DocumentProperty 'Problem variable

'Set wdApp = GetObject(, "Word.Application")
'Set wdDoc = wdApp.ActiveDocument
'MsgBox wdDoc.Name

If wdDoc.BuiltinDocumentProperties.Count > 0 Then
    Set wdDocPro = wdDoc.BuiltinDocumentProperties.Item(1)'I get a type mismatch at this line
    For Each wdDocPro In ActiveDocument.BuiltinDocumentProperties
    'Do stuff with Document properties Names and Values and assign to DocVarArray (not needed for debugging)
    Next wdDocPro
End If

DocVarGrabbing = DocVarArray
Set wdDocPro = Nothing

End Function

1 Ответ

0 голосов
/ 05 января 2019

Тип DocumentProperty в этом разделе в принципе должен иметь тип Office.DocumentProperty - и DocumentProperties будет экземпляром объекта Office.DocumentProperties (документация VSTO , похоже, согласна), и Object Browser находит только один класс с этим именем в библиотеке типов Office - так что это не касается Excel против Word: ни определите ни DocumentProperties, ни DocumentProperty класс.

Это одна проблема. Следующим шагом является то, что проверка типа TypeOf, по-видимому (на удивление, на самом деле) завершается неудачно, когда вы вышли из процесса (например, проверка документа Word из проекта VBA рабочей книги Excel или проверка свойств рабочей книги Excel изнутри Проект Word документа VBA):

Public Function GetWordDocProps(ByVal doc As Word.Document) As Variant
    Dim properties As Variant 'Office.DocumentProperties
    Set properties = doc.BuiltinDocumentProperties

    Dim prop As Variant 'Office.DocumentProperty
    Set prop = properties.Item(1)

    If Not TypeOf properties Is Office.DocumentProperties Then Debug.Print TypeName(properties) 'prints "DocumentProperties"
    If Not TypeOf prop Is Office.DocumentProperty Then Debug.Print TypeName(prop) 'prints "DocumentProperty"

    '...        
End Function

Когда вы игнорируете типы и рассматриваете все как Variant, все «просто работает» ... но с поздним связыванием, так что следите за опечатками и ожидайте ошибку 438, если вы пытаетесь вызвать элемент, который не существует.

...