Excel VBA - 在自动筛选中使用数组作为条件,而不是预期的结果

时间:2017-01-20 16:16:45

标签: arrays excel-vba named-ranges vba excel

此过程的最终目标是删除“TestData”表中具有“SysAccts”表(在“列表”工作表)中列出的用户的所有行。

我正在使用自动过滤来查找这些行,以便我可以选择它们并删除它们。

这是我的代码:

Sub ClearSystemAccts()
    Dim wksData As Worksheet
    Dim objDataTable As ListObject
    Dim varSysAccts As Variant

    Set wksData = ActiveWorkbook.Sheets("Test Data")
    Set objDataTable = wksData.ListObjects("TestData")
    varSysAccts = Worksheets("Lists").Range("SystemAccts")

    With objDataTable.Range
        'turn off the autofilters as a reset
        .AutoFilter
        'set the autofilter with the criteria;
        .AutoFilter field:=2, Criteria1:=varSysAccts, Operator:=xlFilterValues
        'Delete the entire row for the visible cells; _
        'skips the header but also deletes the blank row below the table.
        .CurrentRegion.Offset(1).EntireRow.Delete
        'turn off autofilter
        .AutoFilter
    End With

End Sub

当我运行代码时,自动过滤器在表中不显示任何行。

我已经验证varSysAccts变量已正确填充。

当我将鼠标悬停在自动过滤行中的条件时,我会得到以下内容: Type mismatch notification

我认为问题是当一个表被读入一个数组时,它总是一个动态数组。但该表只有一列。我该如何解决?

已编辑:根据以下评论,我从条件中删除了数组。现在我没有得到类型不匹配,但过滤器仍然没有选择任何行。

1 个答案:

答案 0 :(得分:3)

假设SystemAccts是一列,请使用

varSysAccts = Application.Transpose(Worksheets("Lists").Range("SystemAccts‌​")) 

这将使数组成为一维的,而不是二维的(行x列)。

然后,因为您已有数组,所以只需使用Criteria1:=varSysAccts代替Criteria1:=Array(varSysAccts)