TypeName与VarType
问题描述:
我想检查一个Variant
的类型。可以用TypeName
和VarType
来完成。我猜想使用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"
你错过了一个事实,即'VarType函数(对象)'返回对象的默认属性的类型,如果有的话,而'类型名(对象)'返回名称的对象。 –
@FlorentB .:谢谢,我其实不知道!我已将它添加到我的答案中(包括回购示例)。 – Heinzi