将Word对象指定给VBA中的变量
我的目标是创建我在表中定义的各种全局模板的数组。我的宏读取表格。如果名称指定了可用的模板,则我的数组应包含该对象。如果找不到模板,则数组应包含无法处理的名称。此文档为docm类型。默认情况下,它被指定给Sfs(0)。这是我代码的一个摘录将Word对象指定给VBA中的变量,vba,object,ms-word,variant,Vba,Object,Ms Word,Variant,我的目标是创建我在表中定义的各种全局模板的数组。我的宏读取表格。如果名称指定了可用的模板,则我的数组应包含该对象。如果找不到模板,则数组应包含无法处理的名称。此文档为docm类型。默认情况下,它被指定给Sfs(0)。这是我代码的一个摘录 Private Sub TestSetSfs() Dim Sfs() As Variant SetSfs Sfs Debug.Print Sfs(0).Name Debug.Print VarType(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
我的问题是行集Sfs(0)=ThisDocument。在测试程序的下一行中,Sfs(0)作为对象正常工作,允许Bookmarks.Count。它也在“局部变量”窗口中显示为对象。但是,函数GetTextTbl将其拒绝为“ByRef参数类型不匹配”,在函数调用中替换为ThisDocument时不会这样做。这促使我查看它的VarType,它返回VbString而不是vbObject
让我补充一下,我已经有了在Excel中工作(使用加载项)的想法,但是我需要一个与之等效的Word,如果我可以将对象分配给Sfs()变量,我认为全局模板将满足我的要求。你知道怎么做吗?它需要从
变量
转换成对象
,但我在网上读到的关于这个主题的所有信息都表明,你不能在VBA中将变量
转换成对象
您的备选方案是坚持在所有位置使用变量
(而不是文档
对象),或坚持在所有位置使用对象
,因为它们似乎都提供了本例中所需的功能
因此,将其更改为(使用variant方法):
或者将这两个更改为(使用对象方法):
在所有情况下,将其用作对象对我来说都是最有意义的,因为这样您就可以将GetTextTbl
函数的原始声明用作:
Function GetTextTbl(Tbl As Table, Doc As Document, Tn As String) As Boolean
然后你的智能感知将在这个功能中工作。只需确保不要向其传递Word文档以外的对象,否则会出错。它需要从变体
转换为对象
,但我在网上读到的关于该主题的所有内容都表明,在VBA中无法将变体
转换为对象
您的备选方案是坚持在所有位置使用变量
(而不是文档
对象),或坚持在所有位置使用对象
,因为它们似乎都提供了本例中所需的功能
因此,将其更改为(使用variant方法):
或者将这两个更改为(使用对象方法):
在所有情况下,将其用作对象对我来说都是最有意义的,因为这样您就可以将GetTextTbl
函数的原始声明用作:
Function GetTextTbl(Tbl As Table, Doc As Document, Tn As String) As Boolean
然后你的智能感知将在这个功能中工作。只需确保向其传递的对象不是Word文档,否则会出现错误。回答有点晚,但解决问题的方法是使用集合而不是数组。集合(或脚本。字典)是处理对象的更自然的方式
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
回答有点晚,但问题的解决方案是使用集合而不是数组。集合(或脚本。字典)是处理对象的更自然的方式
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
删除2行debug.print,改用它-debug.print Sfs(0).Bookmarks.Count
,这应该证明它正在按您的要求分配文档对象。也许您是对的,但是为什么在书签检查(对我也适用)后的下一行中GetTextTbl(Tbl,Sfs(0),TnRef)-给出一个“ByRef参数类型不匹配”错误和GetTextTbl(Tbl,ThisDocument,TnRef)不是吗?函数GetTextTbl期望Doc作为Document。正是这一点促使我研究VarType。我将做更多的测试。感谢鼓励。我已经按照您的建议扩展了这个问题。它可能需要从一般对象转换为实际的Document对象,但作为一种解决方法,您可以只更改函数def首先将函数GetTextTbl(Tbl作为表,Doc作为变量,Tn作为字符串)作为布尔值,它将起作用。这并不能完全回答您的问题,但如果您将MsgBox Doc.Bookmarks.Count
放在GetTextTbl()中,它就会起作用
函数。我找到了另一个解决方案选项-使用对象
而不是变量
-将Sfs()作为对象
和函数设置函数(Sfs()作为对象),只要
,那么您就可以使用函数GetTextTbl(Tbl作为表格,Doc作为文档,Tn作为字符串)作为布尔值
删除你的2个debug.print行,改用它-debug.print Sfs(0).Bookmarks.Count
-这应该证明它是根据你的需要分配文档对象的。也许你是对的,但是为什么在书签检查后的下一行GetTextTbl(Tbl,Sfs(0),TnRef)-给出一个“ByRef参数类型不匹配”错误和GetTextTbl(Tbl,ThisDocument,TnRef)不是吗?函数GetTextTbl期望Doc作为Document。正是这一点促使我研究VarType。我将做更多的测试。感谢鼓励。我已经按照您的建议扩展了这个问题。它可能需要从一般对象转换为实际的Document对象,但作为一种解决方法,您可以只更改函数def首先将函数GetTextTbl(Tbl作为表,Doc作为变量,Tn作为字符串)作为布尔值,它将起作用。这并不能完全回答您的问题,但如果您将MsgBox Doc.Bookmarks.Count
放在GetTextTbl()中,它就会起作用
函数。我找到了另一种解决方法-使用对象
而不是变量
-将Sfs()作为对象
和函数设置FS(Sfs()作为对象)只要