隐藏最后一行时查找Excel电子表格的最后一行

我试图找到列A中包含具有以下代码的值的最后一行:

LastRow = DataWorksheet.Range("A:A").Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row

这适用于大多数情况,除非最后几行被过滤掉。 例如,假设我们有30行数据。 如果1-10行可见,11-20被过滤掉,21-30可见,它会成功找到最后一行:它返回30.当一切都可见并且行21-30被过滤掉时,LastRow返回1。

请注意,如果我手动隐藏而不是筛选出第21-30行,它会告诉我最后一行是20。

是什么赋予了? 如果最后一行被过滤,我怎样才能确定最后一行是什么?

编辑:现在看起来好像LastRow正在挑选最后一个未经过滤的行,这与之前的行为有一定的偏差。 一旦我能更好地隔离我遇到的错误/不一致,我会更新此帖。


这些应该忽略过滤/可见性,并给你最后使用的行号:

DataWorksheet.UsedRange.Rows.Count

-要么-

DataWorksheet.Range("A1").SpecialCells(xlCellTypeLastCell).Row

A列中都没有找到最后一个使用过的单元格,但是...那是您需要的吗?


这适用于具有隐藏行和自动过滤器的工作表。 如果最后一个单元格下面的单元格已被格式化(这会导致usedrange大于要查找的行),它也不会给你错误的行。

Sub FindLastRowWithValue()
    Dim ws As Worksheet
    Dim temp As Worksheet
    Dim lastrow As Long

    ' copy the sheet that may have hidden rows
    Set ws = Sheets("Sheet1")
    ws.Copy Before:=Sheets(1)
    Set temp = ActiveSheet

    ' turn off autofiltering if need be
    If temp.AutoFilterMode Then temp.AutoFilterMode = False

    ' unhide all rows
    temp.Columns("A:A").EntireRow.Hidden = False

    ' get the last row with a value now that all rows are unhidden
    lastrow = temp.Range("A" & temp.Rows.Count).End(xlUp).Row

    ' delete the temporary sheet
    Application.DisplayAlerts = False
    temp.Delete
    Application.DisplayAlerts = True

    MsgBox lastrow
End Sub

经历了很多挫折之后,看起来总是存在“vba内置”方法的问题。 例如,列“A”和“WS”是工作表对象:

  • «Ws.Cells(WS.Rows.Count,1).End(xlUp)»失败,隐藏行
  • «WS.Range(“A1”)。查找(...)»在行中隐藏行时失败(也可能是其他情况)
  • «UsedRange»和«.SpecialCells(xlLastCell)»可以返回比预期更高的结果
  • 我的解决方案是使用“WorkSheet.Evaluate”的Excel公式。

    检查非空值(即不会考虑具有空结果的公式):

    Function FindLastRow(R as Range) As Long
        Const NotFoundResult = 1 ' If all cells have an empty value, this value is returned
        FindLastRow = R.Worksheet.Evaluate("IFERROR(LARGE(ROW('" & R.Worksheet.Name & "'!" & R.Address & ")*--('" & R.Worksheet.Name & "'!" & R.Address & " <> """"),1)," & NotFoundResult & ")")
    End Function
    

    检查具有公式或值的最后一个单元格(即使结果为空):

    Function FindLastRow(R as Range) As Long
        Const NotFoundResult = 1 ' If all cells are empty (no value, no formula), this value is returned
        FindLastRow = R.Worksheet.Evaluate("IFERROR(LARGE(ROW('" & R.Worksheet.name & "'!" & R.Address & ")*--(NOT(ISBLANK('" & R.Worksheet.name & "'!" & R.Address & "))),1)," & NotFoundResult & ")")
    End Function
    
    链接地址: http://www.djcxy.com/p/68163.html

    上一篇: Finding the last row of an Excel spreadsheet when the last row is hidden

    下一篇: Curses Difference between newwin and subwin