excel vba - 在autofilter之后选择除标题之外的所有已过滤行

时间:2016-07-16 10:12:39

标签: excel vba excel-vba filter

我正在尝试编写一个宏来执行以下操作:

    来自Sheet1的
  • 观察我输入的数据的A列;
  • 当我在A列的单元格中写入内容时,使用该值来过滤Sheet2;
  • 过滤完成后,
  • 将第二张表格中除列标题以外的所有内容复制到第一张,即使有多个值。

我试着写这个:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range
    Set KeyCells = Range("A:A")
    If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then
        copy_filter Target
    End If
End Sub

Sub copy_filter(Changed)
    Set sh = Worksheets("Sheet2")
    sh.Select

    sh.Range("$A$1:$L$5943") _
        .AutoFilter Field:=3, _
            Criteria1:="=" & Changed.Value, _
            VisibleDropDown:=False
    Set rang = sh.Range("$A$1:$L$5943") _
        .SpecialCells(xlCellTypeVisible)

    rang.Offset(0, 0).Select
    Selection.Copy

    Worksheets("Sheet1").Select
    Worksheets("Sheet1").Range(Changed.Address).Offset(0, 1).Select
    Selection.PasteSpecial Paste:=xlPasteValues

    sh.Range("$A$1:$L$5943").AutoFilter
    Application.CutCopyMode = False
End Sub

但是,当我复制选择时,标题行也会被复制,但是使用.Offset(1,0)会削减标题和1个额外的行,并且不会考虑过滤器没有返回结果的情况。< / p>

如何选择除标题以外的每个已过滤的行?

1 个答案:

答案 0 :(得分:5)

使用sh.UsedRange会为您提供动态范围。在哪里,sh.Range("$A$1:$L$5943")不会缩小并增长以匹配您的数据集。
我们可以像这样修剪标题行:

    Set rang = sh.UsedRange.Offset(1, 0)
    Set rang = rang.Resize(rang.Rows.Count - 1)

但如果没有要返回的数据,SpecialCells(xlCellTypeVisible)会抛出No cells were found.错误。所以我们必须像这样陷入错误:

On Error Resume Next

Set rang = rang.SpecialCells(xlCellTypeVisible)

If Err.Number = 0 Then

End If

On Error GoTo 0
    Sub copy_filter(Changed)
        Dim rang As Range

        Set sh = Worksheets("Sheet2")

        sh.UsedRange.AutoFilter Field:=3, _
                                Criteria1:="=" & Changed.Value, _
                                VisibleDropDown:=False


        Set rang = sh.UsedRange.Offset(1, 0)
        Set rang = rang.Resize(rang.Rows.Count - 1)

        On Error Resume Next
        Set rang = rang.SpecialCells(xlCellTypeVisible)
        If Err.Number = 0 Then
            rang.Copy
            Worksheets("Sheet1").Range(Changed.Address).Offset(0, 1).PasteSpecial Paste:=xlPasteValues
        End If

        On Error GoTo 0

        sh.Cells.AutoFilter

        Application.CutCopyMode = False


    End Sub