首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeName对VarType

TypeName对VarType
EN

Stack Overflow用户
提问于 2017-10-05 07:43:14
回答 2查看 1.8K关注 0票数 5

我想检查一下Variant的类型。可以用TypeNameVarType来完成它。我认为使用VarType更有效,因为它不涉及字符串比较,只是一个数字比较。选择TypeName的任何理由

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-05 07:48:20

我的推荐

对于VarType枚举所涵盖的内置类型,请使用VbVarType。在其他类型中使用TypeName。我将在下面详细解释这个建议。

性能

性能差异很可能可以忽略不计,特别是当您使用VBA编写数据库应用程序时。

VarType

VarType的最大优点是它不使用神奇的字符串:如果您拼写错了vbDouble,就会得到编译时错误(假设您使用的是Option Explicit,这是您应该使用的)。如果您拼写错误的"Double()",您的代码将只是默默地做错误的事情。

TypeName

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

代码语言:javascript
复制
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类的示例:

代码语言:javascript
复制
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"
票数 9
EN

Stack Overflow用户

发布于 2021-05-04 15:05:34

当与对象(如Range或Sheet)一起使用时,TypeName似乎更具体。

例如,使用一个LastRow函数,您希望从其他vba函数中调用该函数,也可以从工作表单元格调用该函数。当从另一个单元格传递工作表名时,它将其作为一个范围来指示,但根据VarType,它是一个字符串(而不是范围/对象)。

代码语言:javascript
复制
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 Function
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46580403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档