【发布时间】:2020-01-18 02:15:37
【问题描述】:
我的目标是创建一个我在表格中定义的各种全局模板的数组。我的宏读取表格。如果名称指定了可用模板,我的数组应该保存该对象。如果找不到模板,则数组应包含无法处理的名称。 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,它返回 VbString 而不是 vbObject。
让我补充一点,我已经有了在 Excel 中工作的想法(使用插件),但我需要 Word 中的等效项,我认为如果我可以将对象分配给 Sfs() 变体,全局模板将满足我的要求。知道该怎么做吗?
【问题讨论】:
-
删除您的 2 个 debug.print 行并改用它 -
Debug.Print Sfs(0).Bookmarks.Count- 这应该证明它正在根据需要分配文档对象。 -
也许你是对的,但为什么 GetTextTbl(Tbl, Sfs(0), TnRef) - 在书签检查后的下一行(这也适用于我) - 给出“ByRef 参数类型不匹配”错误,而 GetTextTbl(Tbl, ThisDocument, TnRef) 没有?函数 GetTextTbl 需要 Doc As Document。正是这一点促使我研究 VarType。我会再做一些测试。谢谢鼓励。
-
我已经按照你的建议扩展了这个问题。
-
它可能需要从通用对象转换为实际的文档对象,但作为一种解决方法,您只需将函数定义更改为
Function GetTextTbl(Tbl As Table, Doc As Variant, Tn As String) As Boolean即可。这并不能完全回答您的问题,但是如果您将MsgBox Doc.Bookmarks.Count放入您的GetTextTbl()函数中,它就会起作用。 -
我找到了另一种解决方法 - 使用
Object而不是Variant-Dim Sfs() As Object和Function SetSfs(Sfs() As Object) As Long- 然后你可以使用Function GetTextTbl(Tbl As Table, Doc As Document, Tn As String) As Boolean
标签: vba object ms-word variant