Vba 先前筛选的工作表的数据源范围选择出现错误9

Vba 先前筛选的工作表的数据源范围选择出现错误9,vba,excel,Vba,Excel,我正在尝试使用以下代码 选择以前筛选的工作表(数据库)的1列中的所有可见单元格,然后 将验证应用于所有可见单元格,从保存在单独表格中的1个动态列(SKU检查)开始。在以下行:Set tbl_5=Activesheet……vba返回错误9,下标超出范围。到达此模块之前,已筛选数据库工作表 如果它是参照物,你知道吗?数据库工作表是表数据,不确定这是否会改变任何内容… 代码: 您的代码中有几个问题: 正如@Ralph在评论中指出的,不可能有一个名为“SKU检查”的表 ListObjects名称不能包

我正在尝试使用以下代码

  • 选择以前筛选的工作表(数据库)的1列中的所有可见单元格,然后

  • 将验证应用于所有可见单元格,从保存在单独表格中的1个动态列(SKU检查)开始。在以下行:
    Set tbl_5=Activesheet……
    vba返回
    错误9,下标超出范围
    。到达此模块之前,已筛选数据库工作表

  • 如果它是参照物,你知道吗?数据库工作表是表数据,不确定这是否会改变任何内容…

    代码:


    您的代码中有几个问题:

  • 正如@Ralph在评论中指出的,不可能有一个名为“SKU检查”的表

    • ListObjects名称不能包含空格
    • 这就是导致“错误9:下标超出范围”的原因
  • tbl_5定义为:
    Dim tbl_5作为列表对象

    • 您试图为此ListObjects分配数据源范围。正如类型名称所暗示的那样:
      • “ListObject”是一个对象
      • “数据源范围”是范围对象
      • 这将产生一个错误
  • 您实际上是在分配.Select操作的结果

    • .Select返回包含True或False(操作结果)的变量
  • WS定义为
    Dim WS as工作簿

    • 您试图将工作表对象分配给它,它将生成另一个错误

  • 若要修复代码,请在工作表(“数据库”)上提供一个名为“SKUCheck”的表:


    @戴维兹曼,这是建立在你以前的基础上的answered@davidZemens,appologies如果tbl_5应该是一个ListObject(每个dim),那么它应该设置为一个ListObject,而不是ListObject的列,当然也不是DataodyRange。还是我遗漏了什么?嘿,拉尔夫,我需要选择特定列的数据源范围。DataBody Rnage是一个列表对象您是否尝试过设置tbl_5=ActiveSheet.ListObjects(“SKU检查”)?
    Sub VALIDATION_c()
    
      Dim tbl_5 As ListObject
      Dim rng As Range
      Dim PH5Rng As Range
      Dim Val5 As Range
      Dim WS As Workbook
    
      Sheets("Database").Select
      Set tbl_5 = ActiveSheet.ListObjects("SKU Check").ListColumns(2).DataBodyRange.Select
      Set rng = tbl_5.DataBodyRange.SpecialCells(xlCellTypeVisible)
      Set Val5 = Sheets("SKU Check").Range("G1:G20")
      Set WS = ThisWorkbook.Worksheets("SKU CHECK")
    
      For Each tbl_5 In rng.Areas
    
        With tbl_5.Validation
        .Delete 'delete previous validation
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
            Formula1:="='" & WS.Name & "'!" & Val5.Address
        End With
      Next
    
      MsgBox ("DONE VALIDATION")
    
    End Sub
    
    Option Explicit
    
    Sub VALIDATION_c()
    
        Dim ws1     As Worksheet
        Dim ws2     As Worksheet
        Dim tbl     As ListObject
        Dim col1    As Range
        Dim col2    As Range
    
        Set ws1 = Worksheets("Database")
        Set ws2 = Worksheets("SKU Check")
        Set tbl = ws1.ListObjects("SKUCheck")
    
        Set col1 = tbl.DataBodyRange.Columns(2).SpecialCells(xlCellTypeVisible)
        Set col2 = ws2.Range("G1:G20")
    
        With col1.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                 Formula1:="='" & ws2.Name & "'!" & col2.Address
        End With
    
        MsgBox ("DONE VALIDATION")
    End Sub