【问题标题】:Determine library name of object variable in VBA 2007..?在 VBA 2007 中确定对象变量的库名称 ..?
【发布时间】: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


【解决方案1】:

您可以使用 TypeOf 来测试一个对象是否实现了特定的接口:

Public Sub Demo()
    Dim r As Excel.range
    Dim fulltype As String
    Set r = ActiveCell
    If TypeOf r Is Excel.Range Then

    ElseIf TypeOf r Is Word.Range Then

    End If
End Sub

如果一个对象实现了一个特定的接口,那么使用相关的方法和属性(在某种程度上)是安全的。

请注意,单个对象可以实现多个接口,请考虑以下 Access 示例:

Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("SELECT TOP 1 ID FROM MSysObjects")
Debug.Print TypeOf rs Is Object
'True
Debug.Print TypeOf rs Is Recordset
'True
Debug.Print TypeOf rs Is Recordset2
'True
Debug.Print TypeOf rs Is DAO.Recordset
'True
Debug.Print TypeOf rs Is DAO.Recordset2
'True
Debug.Print TypeOf rs Is ADODB.Recordset
'False

【讨论】:

  • 仅供参考,TypeOf 测试对象变量是否实现指定接口,而不是确定其实际对象类型。
  • @Rory True,但它会区分这些类型,如果它通过测试,您可以使用相关的属性和方法。在开发可以处理多种类型对象的库时,这通常正是您需要了解的。
  • 我同意,我只是想澄清这一点,因为它并没有严格执行要求,即使它执行要求我>。 ;)
  • 没错,我已经改写了我的答案以反映这一点。感谢您的贡献!
  • Np,我是来回答问题的 :)。希望你能好好利用它。
猜你喜欢
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2016-02-19
相关资源
最近更新 更多