试图设置依赖列表validationW / VBA,得到“应用程序定义或对象定义的错误”

我试图根据另一个单元格的内容设置单元格的列表validation,使用一个命名的范围,使我的数据input表上的一个单元格的内容与Validation表上的一个范围相匹配(参见这个SO问题 )。 命名范围的公式是:

 =OFFSET(validation!$B$1,MATCH(INDIRECT(ADDRESS(CELL("row"),CELL("col")-2)),validation!$A:$A,0)-1,0,COUNTIF(validation!$A:$A,INDIRECT(ADDRESS(CELL("row"),CELL("col")-2))),1) 

问题是,如果由ADDRESS(CELL("row"),CELL("col")-2)引用的单元格为空,则使用Range.Validation.Add设置使用VBA进行的validationRange.Validation.Add给出错误:

 Application-defined or object-defined error 

然后它不会将validation添加到单元格。 有什么样的error handling,我可以做的Validation.Add调用,以确保validation设置? 还是修改命名范围公式的方法,使得即使ADDRESS(CELL("row"),CELL("col")-2)内容在validation页上没有返回匹配项,它也会输出一个值?

作为一个解决办法试试这个:

  1. 修改名为范围的ValList来引用一个简单的范围。
  2. 设置validation。
  3. 将“ValList”恢复为原始参考。

有点笨重,但似乎工作。

 Sub SetVal() Dim s As String s = ActiveWorkbook.Names("ValList").RefersTo ActiveWorkbook.Names("ValList").RefersTo = "=UserEntry!$A$3:$A$6" With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=ValList" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .ShowInput = True .ShowError = True End With ThisWorkbook.Names("ValList").RefersTo = s End Sub