50

Excel で自動フィルターを設定していて、VBA コードを使用して 1 つの列に表示されているすべてのデータをループ処理したい場合、これを行う最も簡単な方法は何ですか?

フィルターで除外されたすべての非表示の行を含めるべきではないため、上から下までの単純な Range は役に立ちません。

良いアイデアはありますか?

4

8 に答える 8

70

セルに 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
于 2012-06-01T12:09:51.573 に答える
17

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
于 2012-06-01T13:15:19.387 に答える
11

A1 のフィルター処理されたデータを下方向に想定する 1 つの方法。

dim Rng as Range
set Rng = Range("A2", Range("A2").End(xlDown)).Cells.SpecialCells(xlCellTypeVisible)
...
for each cell in Rng 
   ...     
于 2012-06-01T12:11:00.793 に答える
-1
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
于 2014-10-03T18:44:41.763 に答える