【发布时间】:2018-06-18 13:56:03
【问题描述】:
如何在 VBA 2007.. 中确定对象变量的完全限定类和成员名称?例如,Excel.Range 而不仅仅是 Range...就像它在代码中出现的那样?
Excel 和 Word 都有一个 Range 对象,但它们是完全不同的类。在下面的示例中,Range 被传递给函数。该函数如何确定它来自哪个类..?
示例结果生成“Microsoft Excel.Range”。虽然很接近,但不一样。但是 Parent.Name 和类名是两个不同的属性,在其他软件中它们可能是完全不同的文本字符串,没有共性。
那么...如何获得Excel.Range 而不是Microsoft Excel.Range..?
'Note: Project has references to both Excel and Word.
Public Sub Demo()
Dim r As Excel.range
Dim fulltype As String
Set r = ActiveCell
fulltype = WhatAmI(r)
Debug.Print fulltype
Select Case fulltype
Case "Excel.Range"
'Do stuff.
Case "Word.Range"
'Do other stuff.
End Select
End Sub
Private Function WhatAmI(ByRef X As Object) As String
Dim typ As String
Dim par As String
typ = TypeName(X)
par = X.Application.Parent.Name
WhatAmI = par & "." & typ
End Function
【问题讨论】:
-
为什么“Microsoft Excel”还不够?它已修复,只需将其映射到逻辑中的“Excel”即可。
-
如果您希望逻辑广泛适用,则不能使用
.Application属性,因为许多对象不具备该属性。不过,在这种情况下,它会起作用,但使用该函数测试随机对象可能会出现运行时错误。 -
哦,如果您真的决定确定父对象,您可能需要阅读this article。幸运的是,它的作者在 SO 上很活跃,并且经常检查 VBA 标签。不幸的是,VBA 默认不支持反射。
-
@ErikvonAsmuth 谢谢! Rubberduck 的实验性反射 API 并没有得到真正的维护……但是,这几乎是唯一的方法。
-
@SMeaden...这是一个很好的观点。我想我的脑子里有太多细节,但它应该可以工作。
标签: excel ms-access ms-word vba