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

Excel 尝试使用VBA设置依赖列表验证,获取;应用程序定义或对象定义错误“;,excel,validation,vba,Excel,Validation,Vba,我正在尝试基于另一个单元格的内容设置单元格的列表验证,使用一个命名范围,该范围将我的数据输入表上的单元格内容与验证表上的范围相匹配(请参阅)。命名范围的公式为: =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)))

我正在尝试基于另一个单元格的内容设置单元格的列表验证,使用一个命名范围,该范围将我的数据输入表上的单元格内容与
验证表上的范围相匹配(请参阅)。命名范围的公式为:

=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)
问题是,如果
地址(单元格(“行”)和单元格(“列”)-2)
所引用的单元格为空,则使用
范围.validation.Add设置VBA验证会出现错误:

Application-defined or object-defined error
然后它不会将验证添加到单元格中。是否可以对
验证执行任何类型的错误处理。添加
调用以确保设置验证?或者修改命名范围公式的方法,以便即使
地址(单元格(“行”)、单元格(“列”)-2)
的内容在
验证
工作表上没有返回匹配项,它也会输出一个值。作为一种解决方法,请尝试以下操作:

  • 修改
    ValList
    命名范围以引用简单范围
  • 设置验证
  • 将“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
    
    作为解决方法,请尝试以下方法:

  • 修改
    ValList
    命名范围以引用简单范围
  • 设置验证
  • 将“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
    

    这似乎确实有效。谢谢你在这个问题上的帮助!这似乎确实有效。谢谢你在这个问题上的帮助!