数据validation列表错误

我试图添加一个数据validation下拉列表,我一直在debugging一段时间无济于事。 我得到一个运行时错误1004,应用程序定义或对象定义的错误。 在Formula1中设置Validation.Add语句的一部分出现错误。

我已经尝试使用一个string引用到一个命名范围,一个string引用到一个标准的范围,并且,如下所示,从工作表上的列表生成一个逗号分隔的列表string,如下面的代码所示。 我用Debug.Print检查了列表string,并得到了预期的结果。

 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 

预先感谢任何指导。

你所有的代码都在工作(当然可以被优化),你所要做的只是删除validation,如果它已经存在。

如果您尝试将validation添加到已经包含一个的单元格,您将收到错误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 

我将使用命名的范围引用来构build公式,以便将Validation对象的Add()方法的Formula1参数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 

正如@cyboashu所指出的,你的错误来自于你在添加一个新的validation之前没有删除validation。

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

公式1应将该范围称为string。 例如:

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

或者,使用你的variables:

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

或者更简单:

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