将Word对象分配给VBA中的变量

问题描述 投票:0回答:1

我的目标是创建由表定义的各种全局模板的数组。我的宏读取表。如果名称指定了可用模板,则我的数组应包含该对象。如果找不到模板,则数组应包含无法处理的名称。 ThisDocument是docm类型的。默认将其分配给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

我的问题是Set Sfs(0)= ThisDocument行。在测试过程的下一行中,Sfs(0)可以作为对象正常工作,并允许Bookmarks.Count。它还在“本地”窗口中显示为一个对象。但是,函数GetTextTbl将其拒绝为“ ByRef参数类型不匹配”,当在函数调用中用ThisDocument替换时,它不会执行此操作。这促使我查看其VarType,该VarType返回VbString而不是vbObject。

[让我补充说,我已经有这个想法可以在Excel(带有插件)中使用,但是我需要在Word中具有等效的概念,如果可以将对象分配给Sfs()变体,则我认为全局模板将满足我的要求。知道怎么做吗?

vba object ms-word variant
1个回答
0
投票
您的替代方法是在所有位置坚持使用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

然后您的智能感知将在该功能内起作用。只要确保您没有将除Word Document以外的对象传递给它,否则会出现错误。

© www.soinside.com 2019 - 2024. All rights reserved.