我想检查一下Variant的类型。可以用TypeName和VarType来完成它。我认为使用VarType更有效,因为它不涉及字符串比较,只是一个数字比较。选择TypeName的任何理由
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发布于 2017-10-05 07:48:20
我的推荐
对于VarType枚举所涵盖的内置类型,请使用VbVarType。在其他类型中使用TypeName。我将在下面详细解释这个建议。
性能
性能差异很可能可以忽略不计,特别是当您使用VBA编写数据库应用程序时。
VarType
VarType的最大优点是它不使用神奇的字符串:如果您拼写错了vbDouble,就会得到编译时错误(假设您使用的是Option Explicit,这是您应该使用的)。如果您拼写错误的"Double()",您的代码将只是默默地做错误的事情。
TypeName
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"Gotchas
注意,如果变量包含一个具有默认属性的对象,VarType将返回默认属性中包含的值的类型,而不是vbObject。下面是一个使用的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"发布于 2021-05-04 15:05:34
当与对象(如Range或Sheet)一起使用时,TypeName似乎更具体。
例如,使用一个LastRow函数,您希望从其他vba函数中调用该函数,也可以从工作表单元格调用该函数。当从另一个单元格传递工作表名时,它将其作为一个范围来指示,但根据VarType,它是一个字符串(而不是范围/对象)。
Public Function LastRow(ByVal sht As Variant, Optional ByVal colLetter As String = "NoColGiven") As Long
Dim aSheet As Worksheet
Select Case TypeName(sht)
Case "Worksheet" 'VarType 9 (vbObject)
'call from vba -> LastRow(Sheets(1))
Set aSheet = sht
Case "String" 'VarType 8 (vbString)
'call from vba/ws function -> LastRow("Sheets1")
Set aSheet = Sheets(sht)
Case "Range" 'VarType 8 (vbString)
'call from ws function -> LastRow(A1) where A1 has textvalue "Sheet1"
Set aSheet = Sheets(sht.Value)
End Select
If colLetter = "NoColGiven" Then
LastRow = aSheet.UsedRange.Rows(aSheet.UsedRange.Rows.Count).row 'last row in whole sheet
Else
LastRow = aSheet.Cells(aSheet.Rows.Count, colLetter).End(xlUp).row 'last row in specified column of sheet
End If
End Functionhttps://stackoverflow.com/questions/46580403
复制相似问题