如果我在输入表上应用自动过滤并运行vba代码,则代码不关心自动过滤。
但有时在自动过滤的工作表上运行vba代码,会弄乱结果。 那么vba关心autofilter
例如。
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并不关心autofilter是否应用于A列并仍然遍历所有行,但是如果我尝试写入应用了自动加载器的特定单元格,那么它就会混乱。
答案 0 :(得分: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
这是一个不起作用的情况。
图表不显示由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
现在让我们再看一个案例。 这不起作用。假设你有一个范围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
为什么忽略具有“1”的单元格(即被过滤掉的行)并写入其余行?实际上它也与标题混淆了???
这很简单。使用Autofilter的想法是根据我们的要求得到相关数据(此时数据是&lt;&gt; 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
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
运行上面的代码时,它会写入除标题之外的所有单元格。
我建议您阅读Excel的内置帮助,以了解AutoFilters的实际工作方式。这样可以帮助您理解它们,这样可以帮助您处理打开了Autofilter的工作表。
HTH