Excel vba 评估包含无效数据的日期格式单元格时出现溢出错误

Excel vba overflow error when evaluating date formatted cell which contains invalid data

我在输入数据时错误地在 "Purchase Order Date" 单元格中输入了我的 "Purchase Order Number"。

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

If Target.Column > 1 And Target <> "" Then

Target.Column 按预期评估为 2,所以我很确定它在 Target <> "" 上失败了。

目标单元格设置为日期格式,我在其中键入“4502554236”(计算结果不正确)。现在查看 sheet 我看到单元格充满了 ########### .

我正在确保单元格不为空,但我想我还需要检查单元格中的数据是否有误?

这样做的正确方法是什么?

谢谢

如果您确定 Target 只是一个 单细胞 那么您可以随时检查:

..........If Target.Text <> "" ...................

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

Debug.Print IsError(Target)

问题是您依赖 Target 作为 Date,因此 是您需要测试的。方便的是,您可以使用 IsDate 函数进行测试。尝试用以下内容替换您的 If 语句:

`If Target.Column > 1 And IsDate(Target) Then`

此后的代码还有几个问题(来自评论):

If Target > "1899-12-30" And Target < "1900-02-01" Then _ 
   Target = CDate(Year(Date) & "-" & Month(Date) & "-" & _
   Format(Day(Target + 1), "00"))

首先,您在比较中混用了 StringDate 类型,这可能会导致灾难,因为您实际上是在进行字符串比较而不是日期比较。这完全取决于日期的格式。考虑这行代码:

Debug.Print DateSerial(2000, 1, 1) > "1899-12-30"

它根据我的区域设置评估为 False,因为它基本上是在测试这个...

Debug.Print "1/1/2000" > "1899-12-30"

...而“/”恰好是 "less than"“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