如何使用excel VBA选择过滤后的数据而不包括列名?

时间:2018-02-23 00:51:47

标签: excel vba excel-vba autofilter

下面是我想出的代码,但问题在于第3行,其中过滤后的数据不一定从第2行开始。如果满足条件的第一个数据点位于第150行,那么它会返回错误:

Error

Total_Rows_Compiled = Worksheets("Compiled").Range("A" & Rows.Count).End(xlUp).Row
Worksheets("Compiled").Range("$A$1:$G$52818").AutoFilter Field:=1, Criteria1:=Worksheets("Sheet1").Cells(l, 1)
Worksheets("Compiled").Range("A2:G" & Total_Rows_Compiled).SpecialCells(xlCellTypeVisible).Select

2 个答案:

答案 0 :(得分:3)

您的代码似乎没有任何重大错误。考虑到这一点,以下是我发现合理无错误的方法组合。

with Worksheets("Compiled")
    .activate
    if .autofiltermode then .autofiltermode = false
    Total_Rows_Compiled = .Range("A" & .Rows.Count).End(xlUp).Row
    with .range("A1:G" & Total_Rows_Compiled)
        .AutoFilter Field:=1, Criteria1:=Worksheets("Sheet1").Cells(l, 1)
        with .resize(.rows.count-1, .columns.count).offset(1, 0)
            if cbool(application.subtotal(103, .cells)) then
                .SpecialCells(xlCellTypeVisible).Select
            end if
        end with
    end with
end with

答案 1 :(得分:2)

您可以遍历Areas

    Dim filterRange As Range, filteredRange As Range, area As Range

    Set filterRange = Worksheets("Compiled").Range("$A$1:$G$52818")
    filterRange.AutoFilter Field:=1, Criteria1:=Worksheets("Sheet1").Cells(l, 1)

    Set filteredRange = Intersect(filterRange, filterRange.Offset(1, 0)).SpecialCells(xlCellTypeVisible) 'remove headers

    If Not filteredRange Is Nothing Then
        For Each area In filteredRange.Areas
            'do something with area
            Debug.Print area.Address
        Next area
    End If

以下数据在" test"上过滤后,会根据需要返回范围(区域)B2:F2B4:F5

enter image description here