Excel VBA - 使用数组作为自动筛选条件,而不是预期结果
Excel VBA - Use array as criteria in autofilter, not expected results
此过程的最终目标是删除 "TestData" table 中具有 "SysAccts" table 中列出的用户的所有行(在"Lists" 工作表)。
我正在使用自动筛选器查找这些行,因此我可以 select 并删除它们。
这是我的代码:
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
当我 运行 代码时,自动过滤器在 table 中不显示任何行。
我已验证 varSysAccts 变量已正确填充。
当我将鼠标悬停在自动筛选行中的条件上时,我得到以下信息:
我觉得问题是当一个table读入一个数组时,它总是一个动态数组。但是 table 只是一列。我该如何解决?
已编辑:根据下面的评论,我从条件中删除了数组。现在我没有得到类型不匹配,但过滤器仍然没有 select 任何行。
假设 SystemAccts 是一个列,使用
varSysAccts = Application.Transpose(Worksheets("Lists").Range("SystemAccts"))
这将使数组 one-dimensional,而不是 two-dimensional(行 x 列)。
然后,因为你已经有了一个数组,你只需要使用Criteria1:=varSysAccts
而不是Criteria1:=Array(varSysAccts)
。
此过程的最终目标是删除 "TestData" table 中具有 "SysAccts" table 中列出的用户的所有行(在"Lists" 工作表)。
我正在使用自动筛选器查找这些行,因此我可以 select 并删除它们。
这是我的代码:
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
当我 运行 代码时,自动过滤器在 table 中不显示任何行。
我已验证 varSysAccts 变量已正确填充。
当我将鼠标悬停在自动筛选行中的条件上时,我得到以下信息:
我觉得问题是当一个table读入一个数组时,它总是一个动态数组。但是 table 只是一列。我该如何解决?
已编辑:根据下面的评论,我从条件中删除了数组。现在我没有得到类型不匹配,但过滤器仍然没有 select 任何行。
假设 SystemAccts 是一个列,使用
varSysAccts = Application.Transpose(Worksheets("Lists").Range("SystemAccts"))
这将使数组 one-dimensional,而不是 two-dimensional(行 x 列)。
然后,因为你已经有了一个数组,你只需要使用Criteria1:=varSysAccts
而不是Criteria1:=Array(varSysAccts)
。