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

spi*_*tor 2 excel ms-access vba ms-word

如何在 VBA 2007 中确定对象变量的完全限定类和成员名称?例如,Excel.Range而不仅仅是Range......就像它在代码中出现的那样?

Excel 和 Word 都有一个Range对象,但它们是截然不同的类。在下面的示例中, aRange被传递给函数。该函数如何确定它来自哪个类......?

该示例的结果生成“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
Run Code Online (Sandbox Code Playgroud)

Eri*_*k A 5

您可以使用 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
Run Code Online (Sandbox Code Playgroud)

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

请注意,单个对象可以实现多个接口,请考虑以下 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
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,`TypeOf` 测试对象变量是否实现了指定的接口,而不是确定其实际对象类型。 (3认同)