在不删除自动过滤器的情况下查找过滤列中最后填充的行

Find the last filled row in a filtered column without dropping the Autofilter

如何在不删除应用的自动过滤器的情况下获取过滤列中最后一个非空单元格的位置?我知道用

很容易得到最后 visible 行的编号
Dim ws as Worksheet, rng As Range
Set rng = Range(Letter & 1 & ":" & Letter & 1) ' where Letter is the letter code of the column
GetLastVisibleRow = ws.Range(Split(ws.Cells(, rng.Column).Address, "$")(1) & ws.Rows.count).End(xlUp).row

但我需要最后 filled 行的编号。同时,我想避免设置

ws.AutoFilterMode = False

如果可能的话。

提前致谢。

可能不是最有效或最快的方法,但这似乎有效:

Function GetLastCellOfColumn(ColLetter As String) As Range
    Dim Col As Range
    Dim Rw As Long
    Set Col = Range(ColLetter & ":" & ColLetter)
    Set GetLastCellOfColumn = Intersect(ActiveSheet.UsedRange, Col)
    For Rw = GetLastCellOfColumn.Cells.Count To 1 Step -1
        If Len(GetLastCellOfColumn.Cells(Rw).Value) > 0 Then
            Set GetLastCellOfColumn = GetLastCellOfColumn.Cells(Rw)
            Exit Function
        End If
    Next
End Function

@jkpieterse 的迷人解决方案加上@BigBen 的有用评论正是我一直在寻找的。只是为了完成线程,返回行号的函数是

Function GetLastFilledCellOfColumn(ws As Worksheet, ColLetter As String) As Long
    Dim Col As Range, Urng As Range, Rw As Long
    Set Col = ws.Range(ColLetter & ":" & ColLetter)
    Set Urng = Intersect(ws.UsedRange, Col)
    For Rw = Urng.Cells.count To 1 Step -1
        If Not IsEmpty(Urng.Cells(Rw)) Then
            GetLastFilledCellOfColumn = Rw
            Exit Function
        End If
    Next
End Function

问题已解决。

所以也许这是另一种调查方式:

Sub Test()

Dim rng As Range
Dim col As Long: col = 2 'Change to whichever column you interested in
Dim rw as Long

With Sheet1 'Change to whichever sheets CodeName you need
    Set rng = .Range("_FilterDatabase").Columns(col)
    rw = .Evaluate("MAX(IF(" & rng.Address & "<>"""",ROW(" & rng.Address & ")))")
End With

End Sub

恐怕我有点仓促,可能犯了一个错误,但我必须继续。希望你明白发生了什么=)


编辑:

以上肯定有效,但通过聊天发现,实际上有一个 ListObject 涉及,称为 Table1,它抛出 AutoFilter 范围。所以这里有两种不同的方法来做同样的事情:

Sub Test()

Dim rng As Range
Dim col As Long: col = 2 'Change to whichever column you interested in
Dim rw as Long

With Sheet1 'Change to whichever sheets CodeName you need
    Set rng = .Range("Table1")
    rw = .Evaluate("MAX(IF(" & rng.Address & "<>"""",ROW(" & rng.Address & ")))")
End With

End Sub

或者,当您不知道 table 的名称时:

Sub Test()

Dim rng As Range
Dim col As Long: col = 2 'Change to whichever column you interested in
Dim rw as Long

With Sheet1 'Change to whichever sheets CodeName you need
    Set rng = .ListObjects(1).Range
    rw = .Evaluate("MAX(IF(" & rng.Address & "<>"""",ROW(" & rng.Address & ")))")
End With

End Sub