在VBA 2007中确定对象变量的库名称..?

时间:2018-01-09 13:55:12

标签: vba excel-vba access-vba word-vba excel

如何在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

1 个答案:

答案 0 :(得分:4)

您可以使用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