vba是否关心自动过滤器?

Kar*_*and 3 excel vba

如果我在输入表上应用自动过滤并运行vba代码,则代码不关心自动过滤器.

但有时在自动过滤的工作表上运行vba代码,会弄乱结果.那么vba关心自动过滤器

例如.

Sub check()
    Dim rng as range
    Set rng = Sheets("input").Range("A1")
    row = 0
    Do until rng.offset(row,0) = ""
        row = row + 1
    Loop
End Sub
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,vba并不关心autofilter是否应用于A列并且仍然遍历所有行,但是如果我尝试在应用自动加载器的特定单元格上进行写入,则会混乱.

Sid*_*out 7

VBA除非您"告诉它"或正在尝试执行可能受自动过滤器影响的操作,否则不关心自动过滤器.

您的上述代码适用于任何工作表,而不仅仅是"输入"工作表.

这是另一种方法,它工作得很漂亮(实际上我一直使用它)

'~~> Remove any filters
ActiveSheet.AutoFilterMode = False

'~~> Filter, offset(to exclude headers) and delete visible rows   
With rRange 
  .AutoFilter Field:=1, Criteria1:=strCriteria
  .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
End With

'~~> Remove any filters
ActiveSheet.AutoFilterMode = False
Run Code Online (Sandbox Code Playgroud)

这是一个不起作用的场景.

图表不显示由Autofilter过滤的数据.但是图表也没有显示隐藏行中存在的数据.这适用于在图表中显示数据的VBA和非VBA方法.

但如果我尝试在应用自动加载器的特定单元格上进行编写,则会混乱.

这取决于你写作的方式和地点.

这很好用.请注意,在下面的代码中,行已被过滤且不可见.但是,我们仍然可以写信给它.

Option Explicit

Sub Sample()
    Dim rng As Range

    Set rng = Sheets("Sheet1").Range("A1")

    rng.AutoFilter Field:=1, Criteria1:="<>1", Operator:=xlAnd

    rng.Offset(1, 0).Value = "Sidd"
End Sub
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在让我们来看另一个案例.这不行.假设你有一个范围A2到A10(A1有Header),它有各种值,范围从1到3.现在你想要用A2代替所有的值:A10,比如1000.如果代码不能给你预期的输出有一个自动过滤器.它不会改变所有细胞.

Option Explicit

Sub Sample()
    Dim rng As Range

    Set rng = Sheets("Sheet1").Range("A1:A10")

    rng.AutoFilter Field:=1, Criteria1:="<>1", Operator:=xlAnd

    rng.Value = "1000"
End Sub
Run Code Online (Sandbox Code Playgroud)

为什么忽略具有"1"的单元格(即被过滤掉的行)并写入其余行?事实上它也与标题混淆了???

在此输入图像描述

这很简单.使用Autofilter的想法是根据我们的要求得到相关数据(目前它是<> 1的数据).当您写入范围时rng,它将写入该范围内可见的所有单元格(包括具有标题的单元格).

那么在这种情况下我们该怎么办?

你有两个选择

1)取下自动过滤器 - 执行必要的操作 - 放回过滤器

Sub Sample()
    Dim rng As Range

    Set rng = Sheets("Sheet1").Range("A1:A10")

    '~~> Put Filter
    rng.AutoFilter Field:=1, Criteria1:="<>1", Operator:=xlAnd

    '~~> Remove Filter
    ActiveSheet.AutoFilterMode = False

    '~~> Write value to the cells (See how we ignore the header)
    Sheets("Sheet1").Range("A2:A10").Value = "1000"

    '~~> Put Filter back
    rng.AutoFilter Field:=1, Criteria1:="<>1", Operator:=xlAnd
End Sub
Run Code Online (Sandbox Code Playgroud)

2)像在问题中一样循环范围

Sub Sample()
    Dim rng As Range, cl As Range

    Set rng = Sheets("Sheet2").Range("A1:A10")

    rng.AutoFilter Field:=1, Criteria1:="<>1", Operator:=xlAnd

    For Each cl In rng
        '~~> Ignoring the Header
        If cl.Row <> 1 then _
        cl.Value = "1000"
    Next
End Sub
Run Code Online (Sandbox Code Playgroud)

运行上面的代码时,它会写入除标题之外的所有单元格.

我建议您阅读Excel的内置帮助,以了解AutoFilters的实际工作方式.这将有助于您了解它们,这将反过来帮助您处理打开自动过滤器的工作表.

HTH