vba关心自动filter吗?

如果我在我的input表上应用自动filter并运行vba代码,代码不关心自动filter。

但是有时在自动过滤的工作表上运行vba代码,会弄乱结果。 vba也关心自动filter

例如。

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 

在上面的代码vba不关心自动filter是否应用在列A,仍然遍历所有行,但如果我尝试写在特定的单元格应用自动生成的应用程序它会搞砸了。

VBA不关心自动filter,除非您“告诉”或正在尝试执行可能受自动filter影响的操作。

您的上述代码将适用于任何工作表,而不仅仅是“input”工作表。

这是另一种方法,它的工作很好(事实上,我一直在使用它)

 '~~> 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 

这是一个不行的情况。

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

但是如果我尝试写入特定的单元格应用autofiler它会搞砸了。

这取决于你如何和在哪里写它。

这工作非常好 。 请注意,在下面的代码中,行已被过滤并且不可见。 但是,我们仍然可以写信给它。

 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 

在这里输入图像描述

现在我们再来看一个案例。 这是行不通的 。 假设你有一个从A2到A10的范围(A1有Header),它有各种不同的取值范围,从1到3.现在你想用A2取代A2:A10中的所有值。这个代码不会给你预期的输出if有一个自动filter。 它不会改变所有的细胞。

 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 

为什么它会忽略具有“1”的单元格(即被过滤的行)并将其写入其余的行? 事实上,它与头部混乱呢?

在这里输入图像说明

这很简单。 拥有Autofilter的想法是根据我们的要求获得相关数据(目前数据是<> 1)。 当你写入范围rng ,它将写入所有可见的单元格(包括具有标题的单元格)。

那么在这种情况下我们做什么?

你有两个select

1)取下自动filter – 执行必要的操作 – 将filter放回原位

 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 

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 

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

我build议您阅读Excel的内置帮助,以了解AutoFilters实际上如何工作。 这将有助于您了解它们,从而帮助您处理打开“自动filter”的工作表。

HTH