excel 获取对自动筛选表中下一个可见单元格的引用

iyr7buue  于 2023-04-13  发布在  其他
关注(0)|答案(4)|浏览(169)

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

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

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

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

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

nzrxty8p

nzrxty8p1#

这里有一个 lightning 般快速的方法来激活过滤区域中的第一个非空白可见单元格。只需将'Range(“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”替换为您要查找的任何属性。
示例:
.公式.行.列
这样的例子不胜枚举

1cklez4t

1cklez4t2#

我真的很纠结于这个问题,并使用了Ryan的解决方案,尽管有点简短,为了我的目的..这可能是因为它得到的简短。:)

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

mrfwxfqh3#

下面是一个使用简单循环直到下一行可见的方法。

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
qltillow

qltillow4#

你可以使用这个函数:

Function SelNext(C As Range) As Range
        Dim Rng As Range, ArN As Integer, Ro As Integer
        Set Rng = C.ListObject.Range.SpecialCells(xlCellTypeVisible)
        For ArN = 1 To Rng.Areas.Count
            If Not Intersect(C, Rng.Areas(ArN)) Is Nothing Then
                If Rng.Areas(ArN).Rows.Count > 1 Then
                    For Ro = 1 To Rng.Areas(ArN).Rows.Count
                        If Not Intersect(C, Rng.Areas(ArN).Rows(Ro)) Is Nothing Then
                            If Ro = Rng.Areas(ArN).Rows.Count Then GoTo na
                            Set SelNext = Intersect(C.EntireColumn, Rng.Areas(ArN))(Ro + 1, 1)
                            GoTo e
                        End If
                    Next
                Else
    na:
                    Set SelNext = Intersect(C.EntireColumn, Rng.Areas(ArN + 1))(1, 1)
                    GoTo e
                End If
            End If
        Next
    e:
    End Function

然后这样叫

Sub SelectNextCellInFilteredTable()
        SelNext(ActiveCell).Select
    End Sub

相关问题