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