获取对autofilter表中下一个可见单元格的引用

时间:2014-11-13 19:35:27

标签: excel-vba vba excel

我有一个位于电子表格顶部的UserForm,只显示包含当前所选单元格的行的信息。表单上的按钮允许用户逐行向上/向下移动电子表格。例如,当单击“下一个记录”按钮时,执行的代码类似于:

Cells(ActiveCell.Row + 1, ActiveCell.Column).Select
LoadValues

即使用户过滤数据然后加载表单,我希望它能够正常工作。但是,使用上面的代码,它想要遍历所有单元格,而不仅仅是过滤后仍然可见的单元格。我已经看到了立即循环通过可见细胞的解决方案,例如,

For Each viscell In rng.SpecialCells(xlCellTypeVisible)
    ...
Next viscell

所以似乎应该有一个更好,更直接的方法来做到这一点,而不是循环遍历所有行,直到我用.Hidden = False到达下一个,但我似乎无法弄清楚如何得到一个引用“下一个可见单元格”以便选择它。

任何指针都将非常感激。感谢。

3 个答案:

答案 0 :(得分:2)

我真的很挣扎于此并使用Ryan的解决方案,虽然有点缩写,但我的目的...... 这可能是最简单的。 :)

ActiveCell.EntireColumn.SpecialCells(xlCellTypeVisible).Find(What:="*", After:=ActiveCell).Activate

答案 1 :(得分:1)

这是一种使用简单循环的方法,直到下一行可见为止。

Dim rng As Range
Set rng = ActiveCell

Dim n As Long: n = 1

Do Until rng.Offset(n, 1).Rows.Hidden = False
    n = n + 1
Loop

rng.Offset(n, 1).Select
LoadValues

答案 2 :(得分:0)

这是一种快速闪烁的方法,用于激活过滤范围内的第一个非空白可见单元格。只需改变范围(" A1")'到你想要搜索的任何范围。还要考虑是否需要xlByColumns或xlByRows。

ActiveSheet.Cells.SpecialCells(xlCellTypeVisible).Find(What:="*", _
    After:=ActiveSheet.Range("A1"), LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByColumns, _
    SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate

我建议尽可能使用表格,因为它们具有易于引用的内置变量命名范围。

这是另一个例子,使用表格。它的目标是搜索特定的列,因此它会更快。

只需在您的值中找到并替换TABLE_NAME和COLUMN_NAME即可。

ActiveSheet.Range("TABLE_NAME[[#All], COLUMN_NAME]]").SpecialCells(xlCellTypeVisible).Find _
    (What:="*", After:=ActiveSheet.Range("TABLE_NAME[[#Headers],[COLUMN_NAME]]"), _
    LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByColumns, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False).Activate

不需要循环,因为它是由Excel"查找"功能。

只是提示,您也可以使用此功能在单独的工作表上获取此类单元格的数据,而无需激活/选择它。

只需找到并替换Dbl_EXAMPLE,SHEET_NAME,TABLE_NAME和COLUMN_NAME即可。

Dim Dbl_EXAMPLE as Double

Dbl_EXAMPLE = Sheets("SHEET_NAME").Range("TABLE_NAME[[#All], COLUMN_NAME]]").SpecialCells(xlCellTypeVisible).Find _
    (What:="*", After:=Sheets("SHEET_NAME").Range("TABLE_NAME[[#Headers],[COLUMN_NAME]]"), _
    LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByColumns, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False).Value2

只需更换" .Value2"最后,无论你寻找什么财产。

示例:

.Formula 。行 .COLUMN

列表继续