数据验证列表错误

时间:2016-08-23 22:29:24

标签: excel vba excel-vba validation excel-2010

我正在尝试添加数据验证下拉列表,我已经调试了一段时间但无济于事。我收到运行时错误1004,应用程序定义或对象定义错误。在Validation.Add语句的Formula1设置部分中发生错误。

我尝试使用对命名范围的字符串引用,对标准范围的字符串引用,以及如下所示,从工作表上的列表生成的逗号分隔列表字符串,如下面的代码所示。我已使用Debug.Print检查了列表字符串并获得了预期的结果。

Sub addPT_Validation()
Dim sValidationList As String
Dim cell As Range

For Each cell In ThisWorkbook.Names("PT_Puldown").RefersToRange
    sValidationList = sValidationList & cell.Value & ","
Next cell

sValidationList = Left(sValidationList, Len(sValidationList) - 1)

With ActiveSheet.Range("D14").Validation
    .Add Type:=xlValidateList, _
            AlertStyle:=xlValidAlertStop, _
            Operator:=xlEqual, _
            Formula1:=sValidationList
    .IgnoreBlank = True
    .InCellDropdown = True
    .ShowError = True
End With
End Sub

提前感谢任何指导。

3 个答案:

答案 0 :(得分:4)

您的所有代码都在运行(当然可以进行优化),您需要做的就是删除已经存在的验证。

如果您尝试将验证添加到已包含一个的单元格,则会收到错误1004。

Sub addPT_Validation()
    Dim sValidationList As String
    Dim cell As Range

    For Each cell In ThisWorkbook.Names("PT_Puldown").RefersToRange
        sValidationList = sValidationList & cell.Value & ","
    Next cell

    sValidationList = Left(sValidationList, Len(sValidationList) - 1)

    With ActiveSheet.Range("D1").Validation
        '/Delete first., in case of any any existing validation
        .Delete

        .Add Type:=xlValidateList, _
                AlertStyle:=xlValidAlertStop, _
                Operator:=xlEqual, _
                Formula1:=sValidationList
        .IgnoreBlank = True
        .InCellDropdown = True
        .ShowError = True
    End With
End Sub

答案 1 :(得分:2)

我使用命名范围引用来构建公式以放入Formula1对象Validation方法的Add()参数,如下所示

Sub addPT_Validation()
Dim formula As String

With ThisWorkbook.Names("PT_Puldown").RefersToRange
    formula = "'" & .Parent.Name & "'!" & .Address(External:=False) 
End With

With ActiveSheet.Range("D14").Validation
    .Add Type:=xlValidateList, _
            AlertStyle:=xlValidAlertStop, _
            Operator:=xlEqual, _
            Formula1:=formula
    .IgnoreBlank = True
    .InCellDropdown = True
    .ShowError = True
End With
End Sub

答案 2 :(得分:1)

正如@cyboashu所指出的那样,您的错误来自于您在添加新验证之前未删除验证的事实。

关于你试图直接将范围传递给Formula1的其他问题:

Formula1应该将范围称为字符串。 例如:

Formula1:="=$G$2:$G$7"

或者,使用您的变量:

Formula1:="=" & ThisWorkbook.Names("PT_Puldown").RefersToRange.Address

或更简单:

Formula1:="=" & Range("PT_Puldown").Address