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

我正在input数据,并在“采购订单date”单元格中错误地input了我的“采购订单号”。

这导致在下面的行上发生溢出错误。

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

Target.Column评估为2,所以我很确定它是目标<>“”上的失败。

目标单元格设置为date格式,我在其中键入“4502554236”(不计算到正确的date)。 现在看在工作表上我看到单元格填充###########。

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

什么是正确的方法来做到这一点?

谢谢

如果您需要testing单元格中的错误,则可以使用IsError()函数。 在你的情况下,这不是问题,并不是什么导致下一行溢出。 具有不能在单元格中表示为date的值不是错误 (对于该单元格格式而言,这仅仅是无效的) – Excel只是将其显示为“#”的string。 你可以通过插入这一行来validation,这将报告“False”:

 Debug.Print IsError(Target) 

问题是你依靠Target是一个Date ,所以是你需要testing。 方便的是,您可以使用IsDatefunction进行testing。 尝试用这个replace你的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")) 

首先,在比较中混合使用StringDatetypes,这可能是灾难的一个原因,因为实际上是在进行string比较而不是date比较。 这完全取决于date的格式。 考虑这一行代码:

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

它与我的区域设置评估为False,因为它基本上是testing这…

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

…和“/”碰巧是“小于”“8”。

请注意,由于1899-12-30是VBA的纪元date,所以可以用一个简单的> 0代替它。 使用DateSerial构build一个testingdate会更安全,更容易,更具可读性。 请注意,您也可以通过一次调用Format来简化格式化datestring的构build:

 Format$(Date + 1, "yyyy-mm-dd") 

但是,如果您已经有单元格格式(由您的string比较工作certificate),则可以让Excel为您设置格式,并将date直接设置为单元格。 结合所有这一切,你得到这样的东西:

 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只是一个单元格,那么您可以随时检查:

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