4

我有一个类似数据库的大表格,第一行包含标题。我想要基于列值的该表的行子集。两个问题:

1)VBA-wise 我想遍历列,当所有必要列的值都匹配时,将整行复制到新工作表中。

2) 行的子集基于列表。我刚刚读到我可以将 Autofilter 与数组一起使用。是否可以从列中输入此数组,而不是在 VBA 代码中手动输入?我使用的列表包含 200 个不同的字符串,并且会定期更新。

其中 CritList 是字符串列表。我仍然需要弄清楚如何,但现在我离开了办公室,所以明天更多。

EDIT1感谢@DougGlancy;自动过滤现在有效。这是他漂亮的代码(我只添加了数组过滤器)。

EDIT2包括一个更精细的数组过滤器,其中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
4

1 回答 1

16

这是一种不同的方法。它的核心是通过打开宏记录器并根据您的规范过滤列来创建的。然后有一些代码来复制结果。它将比循环遍历每一行和每一列运行得更快:

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

附带说明一下,您的代码有比必要更多的循环和计数器变量。您不需要遍历列,只需遍历行。然后,您将检查该行中感兴趣的各个单元格,就像您所做的那样。

于 2012-12-18T15:31:08.400 回答