2012-04-24 10 views
3

入力シートにautofilterを適用してvbaコードを実行すると、コードはオートフィルタを気にしません。vbaはオートフィルタを気にしますか?

しかし、時折、自動ろ過シート上でvbaコードを実行すると、結果が失われます。 vbaはオートフィルタを気にします

たとえば、上記のコードのVBA doesntのケアで

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 

オートフィルタは、すべての行を列Aと、まだ繰り返し処理に適用された場合、私はautofilerは、それが台無しに適用される特定の細胞への書き込みしようとした場合。

+0

は同様にあなたがそれに取り組んでいる一方で、...「ケア」を定義する定義「台無し」... –

+0

フィルター行は魔法のように消えません - あなたはthrought visibe細胞を反復処理したい場合は、 Googleの "vba可視セル"など...私は隠されたセルに書き込むことについてはわかりませんが、それが問題であれば、あなたもgoogle "vba clear autofilter"することができます... – Aprillion

+0

私のクエリは基本的にユーザーはオートフィルタを使用して入力と出力のシートを隠すことができます(データを読みやすくするために彼はそれを行います)...しかし、私はvbaがオートフィルターを気にしないように、何も触れられていないかのように動作するはずです... –

答えて

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 

そして、ここではシナリオです(実際には、私はそれをすべての時間を使用する)です。

グラフには、オートフィルタによってフィルタリングされたデータは表示されません。しかし、グラフには隠れた行にあるデータも表示されません。 これは、図表にデータを表示する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はヘッダー)の範囲が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"(つまり、除外された行)を持ち、残りの行に書き込むセルを無視するのはなぜですか?実際にはそれはヘッダーと同様につまずく???

enter image description here

それは非常に簡単です。オートフィルタを使用するというアイデアは、私たちの要件(現時点では、データが<> 1)に応じて関連するデータを取得します。rngの範囲に書き込むと、その範囲内の見えるセル(ヘッダーを持つセルを含む)に書き込まれます。

この場合、私たちは何をしますか?

次の2つのオプション

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の組み込みヘルプを読み、オートフィルタの実際の動作を理解することをお勧めします。そうすれば、オートフィルタがオンになっているシートの処理に役立ちます。

HTH

+0

この素晴らしい説明に感謝します。これは私が直面していたものです。私はそれに応じて私のコードを変更します –

関連する問題