首页 > 解决方案 > 在 VBA 中将 Word 对象分配给 Variant 变量

问题描述

我的目标是创建一个我在表格中定义的各种全局模板的数组。我的宏读取表格。如果名称指定了可用模板,我的数组应该保存该对象。如果找不到模板,则数组应包含无法处理的名称。此文档为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,它返回 VbString 而不是 vbObject。

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

标签: vbaobjectms-wordvariant

解决方案


它的答案有点晚,但解决您的问题的方法是使用集合而不是数组。集合(或 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


推荐阅读