【问题标题】:Data Validation List Error数据验证列表错误
【发布时间】:2016-08-23 22:29:24
【问题描述】:

我正在尝试添加一个数据验证下拉列表,我已经调试了一段时间没有成功。我收到运行时错误 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

提前感谢您的任何指导。

【问题讨论】:

    标签: vba excel validation excel-2010


    【解决方案1】:

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

    如果您尝试向已包含验证的单元格添加验证,则会收到错误 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
    

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

      • 这仍然会失败并抛出错误 1004,代码需要在尝试添加新数据之前删除单元格的所有现有数据验证。
      • @cyboashu,让他加吧!有趣的是,没有人关心 Formula1 参数中的工作表引用,尽管不确定,但这似乎几乎是 OP 代码的一个很可能的问题,其中工作簿范围的名称用于列表,而 ActiveSheet 引用用于绑定到托管它的单元格...
      • 否则不要接受我的评论。只是想指出以完成。不打算开始任何争论或批评:)
      • @cyboashu,我也没有。
      • 我一开始就是这么做的。我之所以使用一种有点奇怪的方法,是因为这是我放弃之前尝试的最后一件事!
      【解决方案3】:

      正如@cyboashu 所指出的,您的错误来自于您在添加新验证之前没有删除验证。

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

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

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

      或者,使用你的变量:

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

      或者,更简单:

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

      【讨论】:

      • 这很好(不是最好的方法),但你也可以传递字符串并且它是可以接受的。错误 1004 是由于缺少删除语句所致。
      • @cyboashu 我没有做过任何速度测试,但是您可以通过将地址传递给参数来避免字符串构造编码。
      • @cyboashu 哦,我同意你关于失踪delete的重要性
      • 是的,完全同意。但这里的实际问题是在添加之前删除现有的验证,除非我遗漏了什么:)
      • @cyboashu 我同意,但他也写了一个关于尝试使用字符串引用范围对象时的问题。他没有展示他使用的东西,我回应了那部分。我会澄清我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      相关资源
      最近更新 更多