如何处理这个Excel验证怪癖?

时间:2017-10-10 20:32:51

标签: excel-vba validation vba excel

我有这个代码。为了这个例子,它是人为的代码。

Sub x()
    ActiveSheet.Range("A1").Validation.Delete
    ActiveSheet.Range("A1").Validation.Add Type:=xlValidateCustom, Formula1:="=VALUE(RIGHT(A1,6))>0"
End Sub

如果代码执行时A1为空,则会收到错误1004,应用程序定义或对象定义错误。我相信这是因为公式会产生#VALUE!而不是False。如果我尝试手动设置验证,则会收到警告,结果是错误,但如果单击“确定”,则验证将正常工作。

我认为这是因为我没有从验证中豁免空白单元格,所以我添加了一行:

Sub x()
    ActiveSheet.Range("A1").Validation.Delete
    ActiveSheet.Range("A1").Validation.IgnoreBlank = True
    ActiveSheet.Range("A1").Validation.Add Type:=xlValidateCustom, Formula1:="=VALUE(RIGHT(A1,6))>0"
End Sub

但是这只是将错误向上移了一行。现在我在IgnoreBlank = True行上收到了1004错误。

我想我可以暂时在单元格中输入一个值,设置验证,然后删除单元格的内容,但我希望有不同的方式。

我做错了吗?我最初计划在最后以编程方式验证,而不是使用Excel的验证功能。

1 个答案:

答案 0 :(得分:0)

看来你无法在IgnoreBlank某事之前设置Add,此时为时已晚。

除了您自己的解决方法(及其变体,例如将验证设置为始终为TRUE的公式,翻转IgnoreBlank并将公式更改为真实公式),您还可以处理验证公式本身中的空白单元格:

=IF(ISBLANK(A1), TRUE, VALUE(RIGHT(A1,6))>0)