我的目标是创建一个在表中定义的各种全局模板的数组。我的宏读取表。如果名称指定了可用模板,则我的数组应包含该对象。如果找不到模板,则数组应包含无法处理的名称。 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()变体,则我认为全局模板将满足我的要求。知道怎么做吗?
答案 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文档以外的其他对象传递给它,否则会出现错误。