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"))
首先,您在比较中混用了 String
和 Date
类型,这可能会导致灾难,因为您实际上是在进行字符串比较而不是日期比较。这完全取决于日期的格式。考虑这行代码:
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
我在输入数据时错误地在 "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"))
首先,您在比较中混用了 String
和 Date
类型,这可能会导致灾难,因为您实际上是在进行字符串比较而不是日期比较。这完全取决于日期的格式。考虑这行代码:
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