2017-10-05 139 views
1

我正在通过一些vba代码,并发现相当于下面的片段。如果是的话,If中的条件是否可以是真的?Can Variant参数可以变成vbError吗?

Public Sub check(param As String) 
    If VarType(param) = vbError Then 
    ... 

如果param被定义为是什么如何Variant可以在param成为一个错误?

Public Sub check2(param As Variant) 
    If VarType(param) = vbError Then 
    ... 

基础上的意见,声明可以简化为:

If IsError(param) Then 

回答

0

答案是否定的,只有Variant可以变成vbError。您可以使用CVErr函数创建错误。

Sub errorType() 
    Dim v As Variant 
    Dim s As String 

    On Error GoTo finish 
    v = CVErr(13) 

    Debug.Print VarType(v) = vbError 'True: Variant can become error 

    s = CVErr(13) 'Jumps to finish 
    Debug.Print "String can become error" 
    Exit Sub 
finish: 
    Debug.Print "String can't become error" 
End Sub 
1

vbError是一个枚举。它等于10.如果VarType(参数)是10,那么它将是真实的。

这里是怎么玩了一下,以使其与变工作:

Public Sub TestMe() 

    On Error Resume Next 

    Dim i As Variant 
    i = "a" 
    Debug.Print VarType(i + 2) 

    If VarType(i + 10) = vbError Then 
     Debug.Print "VarType equals vbError" 
    End If 

End Sub 
+1

它不回答'帕拉姆如何可以成为一个error' –

+0

注意的是,在第一个例子'param'的类型是'String' – Roland

+1

@PankajJaju - 真的,我已编辑。 – Vityata

3

字符串是VarType函数8并固定到它,所以在你的第一个例子中,条件永远是正确的。然而,第二个可能发生。如果你读的细胞保持无效值的值(例如#VALUE)成一个变种,它会得到VarType函数10(vbError)

只是作为一个例子:

Sub testVBError() 
With ActiveSheet 
    .Cells(1, 1) = 3 
    .Cells(1, 2) = 0 
    .Cells(1, 3).Formula = "=A1/B1" ' Divide by zero 
    Dim v As Variant 
    v = .Cells(1, 3).Value 
    Debug.Print VarType(v) 
End With 
End Sub 
+1

因此,不要像“IsError(param)”那样简单,OP的同事使用了'VarType(param)= vbError' ......我印象深刻! :) – Vityata

+2

我见过比在VBA代码更糟糕的;-) – FunThomas