我在工作表中有一列具有未格式化的日期值。共有三种类型,总是以月份缩写开头:
JAN/19
JAN02/19
JAN19
我正在编写一个宏以遍历该列并将其格式化为日期。 JAN/19
和JAN19
都将被设置为每月的第一天,而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
消息。
答案 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