如何在函数值而不是单元格值上使用IsError?

时间:2019-05-15 16:41:01

标签: excel vba

我在工作表中有一列具有未格式化的日期值。共有三种类型,总是以月份缩写开头:

JAN/19
JAN02/19
JAN19

我正在编写一个宏以遍历该列并将其格式化为日期。 JAN/19JAN19都将被设置为每月的第一天,而JAN02/19将被设置为01/02/19

为了对顶部的列标题和可能的空白行有错误的处理,我想取左边的三个字符,看看它们是否是一个月的缩写。我正在尝试使用以下代码:

If IsError(DateValue("01 " & Left(Cells(1, 1), 3) & " 19")) = True Then

     MsgBox "Oops, " & Left(Cells(1, 1), 3) & " is not a valid month abbreviation"

End If

如果Left(Cells(1, 1), 3)是有效的月份缩写,则跳过消息框,但如果不是,则给出此错误,而不是MsgBox消息。

enter image description here

3 个答案:

答案 0 :(得分:3)

IsDate()是一个非常方便的功能,应该可以按预期工作:

Sub TestMe()

    If IsDate("01 " & Left(Cells(1, 1), 3) & " 19") Then
        Debug.Print "It is a date!"
    Else
        Debug.Print "Oops, " & Left(Cells(1, 1), 3) & " is not a valid month abbreviation"
    End If

End Sub

答案 1 :(得分:2)

Error是一种数据类型。

IsError函数用于确定Variant是否具有变量子类型Error,即给定值是否为Variant/Error

在Excel中,当您读取包含以下内容的单元格时,会得到一个Variant/Error值。 #VALUE!。通过编程,您可以使用Variant/Error函数和CVErr函数以及Excel错误枚举值,例如:

Debug.Print IsError(CVErr(xlErrNA)) ' #N/A cell error

此表达式中的问题:

If IsError(DateValue("01 " & Left(Cells(1, 1), 3) & " 19")) = True Then

..是给IsError赋予了Date,所以该函数将始终返回False= True是多余的)。

但是IsError甚至没有被求值:它的参数需要首先求值,这就是 type mismatch 错误的地方:

Left(Cells(1, 1), 3)

如果Cells(1, 1)包含一个Variant/Error值,则将其强制为String会引发您得到的 type mismatch 错误,因为{{ 1}}不能隐式(或显式)转换为任何其他数据类型。

解决方案是将Error放入其自己的本地Cells(1, 1)变量中:

Variant

然后,您可以评估该值是否为Dim cellValue As Variant cellValue = ActiveSheet.Cells(1, 1).Value 'note: made qualifier and member call explicit

Error

答案 2 :(得分:0)

IsError()不会捕获类型不匹配。您需要执行运行时错误处理程序,以在发生错误后捕获类似的错误。

另一方面,对于此用例,您可以使用IsNumeric()代替IsError()。我推荐这样的东西:

If Not (IsNumeric(Left(Cells(1, 1), 3))) Then    
    MsgBox "Oops, " & Left(Cells(1, 1), 3) & " is not a valid month abbreviation"   
End If