VBA用于过滤列

我有一个很大的类似数据库表,第一行包含标题。 我想根据列值的这个表的行的子集。 两个问题:

1)VBA明智我想通过列循环,当所有必要的列的值都匹配时,将整个行复制到一个新的工作表。

2)行的子集是基于一个列表。 我刚刚阅读我可以使用一个数组的Autofilter。 是否有可能从列中input这个数组,而不是手动input到VBA代码中? 我使用的列表包含200个不同的string,并会定期更新。

CritList是string列表。 我仍然需要弄清楚,但是现在我离开了办公室,明天再走。

编辑1感谢@DougGlancy; 自动过滤现在工作。 这是他美丽的代码(我只加了arraysfilter)。

EDIT2包含一个更复杂的数组filter,其中NameList是我想过滤的列表。 现在一切正常!

Sub FilterAndCopy() Dim LastRow As Long Dim vName As Variant Dim rngName As Range Set rngName = Sheets("Sheet3").Range("NameList") vName = rngName.Value Sheets("Sheet2").UsedRange.Offset(0).ClearContents With Worksheets("Sheet1") .Range("A:E").AutoFilter 'Array filter from NameList .Range("A:J").AutoFilter Field:=3, Criteria1:=Application.Transpose(vName), _ Operator:=xlFilterValues .Range("A:E").AutoFilter field:=2, Criteria1:="=String1" _ , Operator:=xlOr, Criteria2:="=string2" .Range("A:E").AutoFilter field:=3, Criteria1:=">0", _ .Range("A:E").AutoFilter field:=5, Criteria1:="Number" LastRow = .Range("A" & .Rows.Count).End(xlUp).Row .Range("A1:A" & LastRow).SpecialCells(xlCellTypeVisible).EntireRow.Copy _ Destination:=Sheets("Sheet2").Range("A1") End With End Sub 

这是一个不同的方法。 它的核心是通过打开macroslogging器并根据您的规格过滤列创build的。 然后有一些代码来复制结果。 它将比循环遍历每一行和每列的速度更快:

 Sub FilterAndCopy() Dim LastRow As Long Sheets("Sheet2").UsedRange.Offset(0).ClearContents With Worksheets("Sheet1") .Range("$A:$E").AutoFilter .Range("$A:$E").AutoFilter field:=1, Criteria1:="#N/A" .Range("$A:$E").AutoFilter field:=2, Criteria1:="=String1", Operator:=xlOr, Criteria2:="=string2" .Range("$A:$E").AutoFilter field:=3, Criteria1:=">0" .Range("$A:$E").AutoFilter field:=5, Criteria1:="Number" LastRow = .Range("A" & .Rows.Count).End(xlUp).Row .Range("A1:A" & LastRow).SpecialCells(xlCellTypeVisible).EntireRow.Copy _ Destination:=Sheets("Sheet2").Range("A1") End With End Sub 

作为一个方面说明,你的代码有更多的循环和计数器variables超过必要的。 你不需要遍历列,只是通过行。 然后,您会像检查一样检查该行中的各个单元格。