使用VBA循环筛选列表的最简单方法?

mat*_*boy 40 excel vba excel-vba

如果我在Excel中设置了自动过滤器,并且我希望使用VBA代码遍历一列中的所有可见数据,那么最简单的方法是什么?

不应包括已过滤掉的所有隐藏行,因此从上到下的普通范围无济于事.

有什么好主意吗?谢谢.

Ale*_*x P 55

假设A2:A11我的自动过滤器在单元格中有数字1到10 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
Run Code Online (Sandbox Code Playgroud)

也许有一个更好的方法,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
Run Code Online (Sandbox Code Playgroud)

  • 使用```Debug.Print cl.row```获取行号或```cl.address``` (3认同)

Sid*_*out 13

我建议使用Offset假设Headers在第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
Run Code Online (Sandbox Code Playgroud)


Ale*_* K. 9

假设A1中的过滤数据向下的一种方式;

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