尝试使用VBA设置依赖列表验证,获取“应用程序定义或对象定义的错误”

时间:2012-05-19 22:00:25

标签: excel validation vba

我正在尝试根据另一个单元格的内容为单元格设置列表验证,使用与我的数据输入表单上的单元格内容匹配的命名范围到Validation表单上的范围(见this SO question)。命名范围的公式为:

=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设置验证会出错:

Application-defined or object-defined error

然后它不会向单元格添加验证。我可以对Validation.Add调用进行任何类型的错误处理,以确保验证设置完成吗?或者一种修改命名范围公式的方法,即使ADDRESS(CELL("row"),CELL("col")-2)的内容未在validation表单上返回匹配项,它也会输出一个值?

1 个答案:

答案 0 :(得分:0)

作为解决方法试试这个:

  1. 修改ValList命名范围以引用简单范围。
  2. 设置验证。
  3. 将'ValList`恢复为原始参考。
  4. 有点笨重,但似乎有效。

    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