Присвоить объект Word переменной Variant в VBA - PullRequest
0 голосов
/ 18 января 2020

Моя цель - создать массив различных глобальных шаблонов, которые я определяю в таблице. Мой макрос читает таблицу. Если имя указывает доступный шаблон, мой массив должен содержать объект. Если шаблон не может быть найден, массив должен содержать имя, которое не может быть обработано. ThisDocument относится к типу документов. Он назначен Sfs (0) по умолчанию. Вот выдержка из моего кода.

Private Sub TestSetSfs()
    Dim Sfs() As Variant
    SetSfs Sfs
    Debug.Print Sfs(0).Name
    Debug.Print VarType(Sfs(0))             ' returns vbString
End Sub

Function SetSfs(Sfs() As Variant) As Long

    Dim Tbl As Table

    ReDim Sfs(20)                           ' max 20 references
    Set Sfs(0) = ThisDocument

    Debug.Print Sfs(0).Bookmarks.Count      ' works as expected
    Debug.Print VarType(Sfs(0))             ' returns vbString
    Debug.Print GetTextTbl(Tbl, Sfs(0), "SomeName")
End Function

Function GetTextTbl(Tbl As Table, Doc As Document, Tn As String) As Boolean
    GetTextTbl = True
End Function

Моя проблема с строкой Установить Sfs (0) = ThisDocument . В следующей строке процедуры тестирования Sfs (0) корректно работает как объект, разрешая Bookmarks.Count. Это также показано как объект в окне Locals. Однако функция GetTextTbl отклоняет его как «несоответствие типов аргументов ByRef», чего не происходит при замене на ThisDocument в вызове функции. Это побудило меня взглянуть на его VarType, который возвращает VbString вместо vbObject.

Позвольте мне добавить, что у меня уже есть эта идея, работающая в Excel (с надстройками), но мне нужен эквивалент в Word, где я думаю, что глобальный шаблон соответствовал бы моим требованиям, если бы я мог назначать объекты варианту Sfs (). Есть идеи, как это сделать?

1 Ответ

0 голосов
/ 18 января 2020

Его необходимо преобразовать из Variant в Object, но все, что я прочитал на эту тему в Интернете, говорит о том, что вы не можете преобразовать Variant в Object в VBA.

Ваши альтернативы - придерживаться использования Variant во всех местах (вместо объекта Document) или придерживаться использования Object во всех местах, так как они оба предоставляют функциональность, необходимую в этом примере .

Так что либо измените его на этот (для использования метода варианта):

Function GetTextTbl(Tbl As Table, Doc As Variant, Tn As String) As Boolean

Или измените оба на этот (для использования метода объекта):

Dim Sfs() As Object 

Function SetSfs(Sfs() As Object) As Long 

Использование его как Object во всех случаях имеет для меня наибольшее значение, так как тогда вы можете использовать исходное объявление вашей функции GetTextTbl как:

Function GetTextTbl(Tbl As Table, Doc As Document, Tn As String) As Boolean

И затем ваш intellisense будет работать внутри этой функции. Просто убедитесь, что вы не передаете ему объект, отличный от документа Word, иначе вы получите ошибку.

...