Самый простой способ прокрутки фильтрованного списка с помощью VBA?

Если у меня есть автоматический фильтр, настроенный в Excel, и я хочу пропустить все видимые данные в одном столбце с кодом VBA, какой самый простой способ сделать это?

Все скрытые строки, которые были отфильтрованы, не должны быть включены, поэтому простой диапазон сверху вниз не помогает.

Любые хорошие идеи? Благодарю.

Ответ 1

Предположим, что у меня есть номера от 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

Ответ 2

Я бы рекомендовал использовать 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

Ответ 3

Один из способов принятия фильтрованных данных в A1 вниз;

dim Rng as Range
set Rng = Range("A2", Range("A2").End(xlDown)).Cells.SpecialCells(xlCellTypeVisible)
...
for each cell in Rng 
   ...     

Ответ 4

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