计算包含无效数据的日期格式单元格时,Excel vba溢出错误

计算包含无效数据的日期格式单元格时,Excel vba溢出错误,excel,vba,date,overflow,Excel,Vba,Date,Overflow,我在输入数据时,在“采购订单日期”单元格中错误地输入了“采购订单编号” 这导致下一行出现溢出错误 If Target.Column > 1 And Target <> "" Then 如果Target.Column>1且目标为“”,则 正如预期的那样,Target.Column的计算结果为2,因此我非常确定它在目标“”上失败 目标单元格设置为日期格式,我在其中键入了“4502554236”(计算结果不正确)。现在看这张表,我看到牢房里满是 我确定单元格不是空的,但我想我还需

我在输入数据时,在“采购订单日期”单元格中错误地输入了“采购订单编号”

这导致下一行出现溢出错误

If Target.Column > 1 And Target <> "" Then
如果Target.Column>1且目标为“”,则
正如预期的那样,Target.Column的计算结果为2,因此我非常确定它在目标“”上失败

目标单元格设置为日期格式,我在其中键入了“4502554236”(计算结果不正确)。现在看这张表,我看到牢房里满是

我确定单元格不是空的,但我想我还需要检查单元格中的数据是否不是错误

正确的方法是什么


谢谢

如果您确定
目标
只是一个单单元格,那么您可以随时检查:

..........If Target.Text <> "" ...................
…如果Target.Text“。。。。。。。。。。。。。。。。。。。

如果您确定
目标
只是一个单单元格,那么您可以随时检查:

..........If Target.Text <> "" ...................
…如果Target.Text“。。。。。。。。。。。。。。。。。。。

如果需要测试单元格中的错误,可以使用
IsError()
函数。在您的情况下,这不是问题所在,也不是导致下一行溢出的原因。在单元格中具有不能表示为日期的值不是错误(对于该单元格格式无效)-Excel只是将其显示为“#”字符串。您可以通过插入此行来验证这一点,该行将报告“False”:

问题是您依赖于
目标
日期
,因此这就是您需要测试的内容。方便的是,您可以使用
IsDate
函数进行测试。尝试将
If
语句替换为以下内容:

`If Target.Column > 1 And IsDate(Target) Then`
这段代码之后还有几个问题(从注释中):

它在我的区域设置中计算为False,因为它基本上是在测试这个

Debug.Print "1/1/2000" > "1899-12-30"
…和“/”正好“小于”8

请注意,由于1899-12-30是VBA的纪元日期,您可以用一个简单的
>0
来替换它。使用
DateSerial
构建要测试的日期更安全、更容易、可读性更强。请注意,您还可以通过调用
Format
,简化格式化日期字符串的构建:

Format$(Date + 1, "yyyy-mm-dd")
但是,如果您已经有了单元格格式(通过字符串比较可以证明),您可以让Excel为您进行格式设置,并直接将日期设置为单元格。将所有这些结合起来,你会得到如下结果:

If Target.Column > 1 And IsDate(Target) Then
    If Target > 0 And Target < DateSerial(1900, 2, 1) Then
        Target = Date + 1
    End If
End If
如果Target.Column>1和IsDate(目标),则
如果目标>0且目标<日期序列(1900、2、1),则
目标=日期+1
如果结束
如果结束

如果需要测试单元格中的错误,可以使用
IsError()
函数。在您的情况下,这不是问题所在,也不是导致下一行溢出的原因。在单元格中具有不能表示为日期的值不是错误(对于该单元格格式无效)-Excel只是将其显示为“#”字符串。您可以通过插入此行来验证这一点,该行将报告“False”:

问题是您依赖于
目标
日期
,因此这就是您需要测试的内容。方便的是,您可以使用
IsDate
函数进行测试。尝试将
If
语句替换为以下内容:

`If Target.Column > 1 And IsDate(Target) Then`
这段代码之后还有几个问题(从注释中):

它在我的区域设置中计算为False,因为它基本上是在测试这个

Debug.Print "1/1/2000" > "1899-12-30"
…和“/”正好“小于”8

请注意,由于1899-12-30是VBA的纪元日期,您可以用一个简单的
>0
来替换它。使用
DateSerial
构建要测试的日期更安全、更容易、可读性更强。请注意,您还可以通过调用
Format
,简化格式化日期字符串的构建:

Format$(Date + 1, "yyyy-mm-dd")
但是,如果您已经有了单元格格式(通过字符串比较可以证明),您可以让Excel为您进行格式设置,并直接将日期设置为单元格。将所有这些结合起来,你会得到如下结果:

If Target.Column > 1 And IsDate(Target) Then
    If Target > 0 And Target < DateSerial(1900, 2, 1) Then
        Target = Date + 1
    End If
End If
如果Target.Column>1和IsDate(目标),则
如果目标>0且目标<日期序列(1900、2、1),则
目标=日期+1
如果结束
如果结束

谢谢,这似乎修复了此行的溢出错误。但是,它不会捕获错误,并在后续的行中继续失败。如果Target>1899-12-30且Target<1900-02-01,那么utarget=CDate(年(日期)&“-”&月(日期)&“-”和格式(天(目标+1),“00”)。我将尝试使用中描述的数据验证excel功能拒绝无效日期。这不是类型不匹配而不是溢出吗?不,它说的正是,3月3日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日########”这对错误有效。谢谢,这似乎修复了此行的溢出错误。但是,它不会捕获错误,并在后续的行中继续失败。如果Target>1899-12-30且Target<1900-02-01,那么utarget=CDate(年(日期)&“-”&月(日期)&“-”和格式(天(目标+1),“00”)。我将尝试使用中描述的数据验证excel功能拒绝无效日期。这不是类型不匹配而不是溢出吗?不,它说的正是,3月3日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日#####################”这对错误是有效的。这里发生的事情远不止你根据@GarysStudent对答案的评论而做出的
If
。当我测试这个时,我不会得到溢出,直到你的下一行代码。请发布您的所有代码,这样我们就有了一个答案。这里的内容比您根据答案b上的评论发表的
If
声明要多