当输出为空时,excel中的自动过滤器会失败(当输出为空时它会带来全部)

时间:2014-10-07 06:06:44

标签: excel excel-vba filter vba

我正在使用以下代码进行自动过滤。它的工作正常。问题是如果输出值为空,则过滤器会给出所有值。我正在寻找如果空了它将显示空行。

Sub filter()
       Application.ScreenUpdating = False
       Dim Location As String
       Dim due As String
       Sheets("sheet2").Activate
       due = Range("b14").Value
       Location = Range("a14").Value
       Range("a16:j1000").ClearContents
       Sheets("Sheet1").Select
       Range("a1:j1000").Select
       Selection.AutoFilter
       ActiveSheet.Range("$A$1:$j$1000").AutoFilter Field:=1, Criteria1:=due
       ActiveSheet.Range("$A$1:$j$1000").AutoFilter Field:=2, Criteria1:=Location
       Range("c2:i1000").Select
       Selection.Copy
       Sheets("sheet2").Activate
       Range("b16").Select
       Selection.PasteSpecial
       Sheets("sheet1").Select
       Selection.AutoFilter
       Sheets("sheet2").Select
       Range("b16").Activate
       Application.ScreenUpdating = True
    End Sub

1 个答案:

答案 0 :(得分:0)

当过滤器未显示结果时,复制过滤列表中的所有数据是一个已知错误。通常,我使用Application.Subtotal(103, ...)SUBTOTAL Function)在对已过滤列表执行任何操作之前检查可见记录。

Sub filter()
    Application.ScreenUpdating = False
    Dim Location As String, due As String

    With Sheets("sheet2")
        due = .Range("b14").Value
        Location = .Range("a14").Value
        .Range("a16:j1000").ClearContents
    End With

    With Sheets("sheet1").Range("a1:j1000")
        .AutoFilter
        .AutoFilter Field:=1, Criteria1:=due
        .AutoFilter Field:=2, Criteria1:=Location
        With .Offset(1, 2).resize(.rows.count - 1, 7)
            If CBool(Application.Subtotal(103, .Cells)) Then _
                .Copy Destination:=Sheets("sheet2").Range("b16")
        End With
        .AutoFilter
    End With

    With Sheets("sheet2")
        .Activate
        Range("b16").Activate
    End With
    Application.ScreenUpdating = True
End Sub

我已经成功地对样本数据进行了测试。比较日期时要小心使用字符串(例如 due )。

当使用VBA过滤列表并随后删除可见记录时,这一点尤为重要,因为没有可见记录会导致整个数据矩阵被删除。此外,从宏运行时,没有UnDo