Excel で自動フィルターを設定していて、VBA コードを使用して 1 つの列に表示されているすべてのデータをループ処理したい場合、これを行う最も簡単な方法は何ですか?
フィルターで除外されたすべての非表示の行を含めるべきではないため、上から下までの単純な Range は役に立ちません。
良いアイデアはありますか?
セルに 1 から 10 の数字がA2:A11
あり、オートフィルターが にあるとしA1
ます。ここで、5 より大きい数値 (つまり、6、7、8、9、10) のみを表示するようにフィルタリングします。
このコードは、可視セルのみを印刷します。
Sub SpecialLoop()
Dim cl As Range, rng As Range
Set rng = Range("A2:A11")
For Each cl In rng
If cl.EntireRow.Hidden = False Then //Use Hidden property to check if filtered or not
Debug.Print cl
End If
Next
End Sub
おそらくもっと良い方法がありますSpecialCells
が、上記はExcel 2003でうまくいきました。
編集
でより良い方法を見つけましたSpecialCells
:
Sub SpecialLoop()
Dim cl As Range, rng As Range
Set rng = Range("A2:A11")
For Each cl In rng.SpecialCells(xlCellTypeVisible)
Debug.Print cl
Next cl
End Sub
Offset
ヘッダーが行 1 にあると仮定して使用することをお勧めします。この例を参照してください。
Option Explicit
Sub Sample()
Dim rRange As Range, filRange As Range, Rng as Range
'Remove any filters
ActiveSheet.AutoFilterMode = False
'~~> Set your range
Set rRange = Sheets("Sheet1").Range("A1:E10")
With rRange
'~~> Set your criteria and filter
.AutoFilter Field:=1, Criteria1:="=1"
'~~> Filter, offset(to exclude headers)
Set filRange = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow
Debug.Print filRange.Address
For Each Rng In filRange
'~~> Your Code
Next
End With
'Remove any filters
ActiveSheet.AutoFilterMode = False
End Sub
A1 のフィルター処理されたデータを下方向に想定する 1 つの方法。
dim Rng as Range
set Rng = Range("A2", Range("A2").End(xlDown)).Cells.SpecialCells(xlCellTypeVisible)
...
for each cell in Rng
...
Call MyMacro()
ActiveCell.Offset(1, 0).Activate
Do Until Selection.EntireRow.Hidden = False
If Selection.EntireRow.Hidden = True Then
ActiveCell.Offset(1, 0).Activate
End If
Loop