vba - 在 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() 变体,我认为全局模板将满足我的要求。知道怎么做吗?
解决方案
它的答案有点晚,但解决您的问题的方法是使用集合而不是数组。集合(或 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
推荐阅读
- kubernetes - 使用 yaml 文件创建 Kubernetes 副本集失败
- android - Androidx 项目无法识别使用 android.support.v7 的库类
- sql - 在一对多关系中插入命令
- javascript - JavaScript 返回未定义 - AWS Comprehend
- vue.js - Favicon 没有出现在 VueJS 中
- android - 为什么 Intent 的额外字符串变成了另一个?
- java - 在 Groovy 中发出 Java Lambda
- javascript - 不能在 VUEJS 中的异步函数之外使用关键字“等待”
- spring-boot - spring.jpa.hibernate.ddl-auto=none 问题
- r - 当第一个参数是字符时,为什么 `ave` 和 `table` 返回字符?