Excel VBA:可以删除验证但不能添加新验证

时间:2012-12-06 16:29:52

标签: excel validation vba

我的代码如下

If Cells(Target.Row, 2) = "" And (Cells(Target.Row, 3) = "" Or Cells(Target.Row, 3) = "") Then
    Sheets("MySheet").Activate
    Cells(Target.Row, 3).Activate
    ActiveCell.Validation.Delete
    If (Cells(Target.Row, 2) = "Type A") Then
        ActiveCell.Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=AvailableVersions"
    ElseIf (Cells(Target.Row, 2) = "Type B") Then
        ActiveCell.Validation.Delete
    Else
        ActiveCell.Validation.Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertInformation, Formula1:="0", Formula2:="9999999"
    End If
End If

每当我到达ActiveCell.Validation.Add

时,我遇到的问题就出现了
Run Time Error '1004': Application-defined or object-defined error

这不是一个非常有用的错误,并且这种情况同时发生在数字和列表验证类型中,所以我确信它不是列表本身的问题,无论如何都有工作簿级别范围。它永远不会出现在我觉得奇怪的ActiveCell.Validation.Delete上吗?

我一直在谷歌试图找到一个解决方案,并且大多数人认为它是由一个按钮运行动态验证代码引起的,尽管有Activate调用,但是我正在使用工作表更改事件而不是按钮上运行按,所以我不认为这是我的问题 - 任何想法?我基本上浪费了一整天的时间! :(

1 个答案:

答案 0 :(得分:2)

如果您没有从工作表事件中运行代码,那么您的代码就可以了。对我来说,当您尝试从事件过程中选择新单元格时会出现问题。我重写了你的代码在没有选择不同单元格的情况下尝试做的事情。

试试这个:

If Cells(Target.Row, 2) = "" And (Cells(Target.Row, 3) = "" Or Cells(Target.Row, 3) = "") Then
    With Sheets("MySheet")
        .Cells(Target.Row, 3).Validation.Delete
        If (.Cells(Target.Row, 2) = "Type A") Then
            .Cells(Target.Row, 3).Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=AvailableVersions"
        ElseIf (.Cells(Target.Row, 2) = "Type B") Then
            .Cells(Target.Row, 3).Validation.Delete
        Else
            .Cells(Target.Row, 3).Validation.Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertInformation, Formula1:="0", Formula2:="9999999"
        End If
    End With
End If

如果AvailableVersions不是列表的有效定义名称,则可能出现另一个错误。