Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Word对象指定给VBA中的变量_Vba_Object_Ms Word_Variant - Fatal编程技术网

将Word对象指定给VBA中的变量

将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))

我的目标是创建我在表中定义的各种全局模板的数组。我的宏读取表格。如果名称指定了可用的模板,则我的数组应包含该对象。如果找不到模板,则数组应包含无法处理的名称。此文档为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
我的问题是行集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()作为对象)只要