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