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

时间:2020-01-18 02:15:37

标签: vba object ms-word variant

我的目标是创建一个在表中定义的各种全局模板的数组。我的宏读取表。如果名称指定了可用模板,则我的数组应包含该对象。如果找不到模板,则数组应包含无法处理的名称。 ThisDocument 是docm类型。默认将其分配给Sfs(0)。这是我的代码的摘录。

// ...

if (tempCleanText.at(firstChar) == tempCleanText.at(lastChar))

{
   return palindromeCheck(tempCleanText, ++firstChar, --lastChar); 
}

else
    return false;
// ...

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

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

2 个答案:

答案 0 :(得分:2)

它的答案有点晚,但解决您的问题的方法是使用集合而不是数组。集合(或 Scripting.Dictionaries)是处理对象的更自然的方式。

Private Sub TestSetSfs()
    Dim Sfs As Collection
    Set Sfs = New Collection
    SetSfs Sfs
    Debug.Print Sfs.Item(1).Name
    Debug.Print VarType(Sfs.Item(1))             ' returns vbString
End Sub

Function SetSfs(ByVal Sfs As Collection) As Long

    Dim Tbl As Table

    
    Sfs.Add ThisDocument

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

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

答案 1 :(得分:0)

需要将其从Variant强制转换为Object,但是我在网上阅读的所有内容都表明您无法将Variant转换为{{1} }。

您的替代方案是在所有位置坚持使用Object(而不是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

然后,您的智能感知将在该函数内部起作用。只要确保您没有将Word文档以外的其他对象传递给它,否则会出现错误。

相关问题