Если у меня есть автоматический фильтр, настроенный в Excel, и я хочу пропустить все видимые данные в одном столбце с кодом VBA, какой самый простой способ сделать это?
Все скрытые строки, которые были отфильтрованы, не должны быть включены, поэтому простой диапазон сверху вниз не помогает.
Любые хорошие идеи? Благодарю.
Предположим, что у меня есть номера от 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
SpecialCells
. Недавно я столкнулся с проблемой из-за способа, которым Excel отправляет .Address
этих ячеек (на основе их постоянного появления).
Один из способов принятия фильтрованных данных в A1 вниз;
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
Debug.Print cl.row
чтобы получить номер строки илиcl.address