4

入力シートに自動フィルターを適用してから 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 に自動フィルターが適用されているかどうかを気にせず、すべての行を反復処理します。ただし、オートフィルターがあるセルに書き込もうとすると、めちゃくちゃになります。

4

1 に答える 1

8

オートフィルターの影響を受ける可能性のあるアクションに「指示」するか、実行しようとしない限り、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 の両方の方法に適用されます

しかし、オートファイラーが適用されている特定のセルに書き込もうとすると、めちゃくちゃになります。

それはあなたがそれを書く方法と場所に依存します。

これは非常にうまく機能します。以下のコードでは、行がフィルター処理されており、表示されていないことに注意してください。ただし、まだ書き込むことができます。

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

ここに画像の説明を入力

では、別のケースを見てみましょう。これは機能しません。1 から 3 までのさまざまな値を持つ範囲 A2 から A10 (A1 にはヘッダーがあります) があるとします。ここで、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」を持つセル (つまり、除外された行) を無視し、残りの行に書き込むのはなぜですか? 実際、ヘッダーも台無しですか?

ここに画像の説明を入力

とても簡単です。オートフィルターを持つという考えは、私たちの要件が何であるかに従って関連データを取得することです (現時点では <> 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

于 2012-04-24T06:51:11.590 に答える