2012-04-24 47 views
3

如果我在自己的输入表上应用自动过滤器并运行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 

在上面的代码VBA不关心如果自动筛选通过所有行施加在列A和静止迭代,但如果我尝试在其中应用autofiler特定细胞写弄乱。

+0

当你在它,定义“搅乱”,以及... – 2012-04-24 06:33:51

+0

过滤行不神奇消失定义“照顾” ...... - 如果你想要遍历throught visibe细胞,谷歌“VBA可见细胞”,例如...我不知道写入隐藏的单元格,但如果这是一个问题,你也可以谷歌“VBA清除自动过滤器”,你知道.. – Aprillion 2012-04-24 06:44:39

+0

我的查询基本上是用户可以使用自动过滤器来隐藏和取消隐藏输入和输出表单(为了使数据更清晰,他会这样做)...但我不想vba关心自动过滤器,它应该像没有任何东西一样工作... – 2012-04-24 08:08:08

回答

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方法。

,但如果我尝试在其中应用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 

enter image description here

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

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”(即对被滤除行)和写入行的其余部分的细胞?事实上,它与头部混淆以及?

enter image description here

这是相当简单的。拥有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 

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 

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

我建议您阅读Excel的内置帮助,以了解AutoFilters的实际工作方式。这可以帮助您了解它们,从而帮助您处理打开Autofilter的工作表。

HTH

+0

谢谢你这个精彩的解释..这就是我面对的..我会相应地改变我的代码 – 2012-04-25 04:42:07