Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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