TypeName与VarType

TypeName与VarType

问题描述:

我想检查一个Variant的类型。可以用TypeNameVarType来完成。我猜想使用VarType会更高效,因为它不涉及字符串比较,只是数字比较。喜欢TypeName的任何理由?TypeName与VarType

Public Sub testType() 
    Dim b() As Double 
    Dim a As Variant 
    a = b 

    Debug.Print TypeName(a) = "Double()" 'True 
    Debug.Print VarType(a) = vbArray + vbDouble 'True 
End Sub 

我的建议

使用VarType为内置由VbVarType枚举类型覆盖。其他类型使用TypeName。我会在下面详细解释这个建议。

性能

的性能差异很可能是微不足道的,特别是如果你使用VBA编写数据库应用程序。

VarType函数

VarType一大优势是,它不使用魔法的字符串:如果你拼错vbDouble,你会得到一个编译时错误(假设你使用Option Explicit,你应该)。如果你拼错"Double()",你的代码只会默默地做错误的事情。

类型名

TypeName的优点是,它也适用于未覆盖的VbVarType枚举类型:

Dim b As New Collection 
Dim a As Variant 
Set a = b 

Debug.Print VarType(a)  ' Prints just the generic vbObject constant 
Debug.Print TypeName(a)  ' Prints "Collection" 

陷阱

注意,如果变量包含默认属性VarType返回包含在默认属性中的值的类型而不是vbObject。下面是使用的MS Access VBA的TempVar的类的例子:

TempVars("x") = 123 

Dim a As Variant 
Set a = TempVars("x") 

Debug.Print VarType(a) ' Prints vbInteger, the type of a.Value's current content. 
         ' (Value is TempVar's default property) 

Debug.Print TypeName(a) ' Prints "TempVar" 
+0

你错过了一个事实,即'VarType函数(对象)'返回对象的默认属性的类型,如果有的话,而'类型名(对象)'返回名称的对象。 –

+0

@FlorentB .:谢谢,我其实不知道!我已将它添加到我的答案中(包括回购示例)。 – Heinzi