2012-04-24 103 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