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

31

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

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

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

Теги:
excel-vba
excel

4 ответа

41
Лучший ответ

Предположим, что у меня есть номера от 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
  • 0
    Спасибо за ответы на все вопросы! Все они были более или менее одинаковыми (мне нужен был ключ SpecialCells (xlCellTypeVisible)), поэтому трудно выбрать правильный ответ.
  • 1
    используйте Debug.Print cl.row чтобы получить номер строки или cl.address
11

Я бы рекомендовал использовать 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
  • 0
    Это хороший способ решения проблемы. Мне нравится ваш подход.
  • 1
    Хорошее решение, Сид. Тем не менее, я буду очень осторожен при использовании SpecialCells . Недавно я столкнулся с проблемой из-за способа, которым Excel отправляет .Address этих ячеек (на основе их постоянного появления).
Показать ещё 5 комментариев
8

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

dim Rng as Range
set Rng = Range("A2", Range("A2").End(xlDown)).Cells.SpecialCells(xlCellTypeVisible)
...
for each cell in Rng 
   ...     
-2
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
  • 1
    Было бы полезно, если бы вы предоставили некоторое объяснение того, что делает код.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню