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)
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)
假设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)
| 归档时间: |
|
| 查看次数: |
165579 次 |
| 最近记录: |