我正在尝试在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正在挑选最后一个未经过滤的行,这与之前的行为完全不同。一旦我能够更好地隔离我遇到的错误/不一致,我会更新这篇文章。
答案 0 :(得分:2)
这些应忽略过滤/可见性,并为您提供最后使用的行号:
DataWorksheet.UsedRange.Rows.Count
-OR -
DataWorksheet.Range("A1").SpecialCells(xlCellTypeLastCell).Row
两者都没有找到A列中最后一个使用过的单元格,但是......你需要的是什么?
答案 1 :(得分:1)
这适用于包含隐藏行和自动过滤器的工作表。如果已经格式化了具有值的最后一个单元格下面的单元格(这将导致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
答案 2 :(得分:1)
经过很多挫折后,看起来总是存在“vba内置”方法的问题。例如,列“A”和“WS”是工作表对象:
我的解决方案是使用带有“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
答案 3 :(得分:1)
我假设 Slothario 的工作表结构简单,具有以下主要特点:
在这种情况下,这里有两种简单的方法来识别不同类型的“最后一行”:
Cells.SpecialCells(xlLastCell).Row 'Last row that is not hidden or filtered out
Activesheet.UsedRange.Rows.Count 'Last row with a value in it (even if the row is hidden; only gives right answer if row 1 is nonblank)
如果最上面一行/几行可能为空,则需要将第二个选项修改为:
Activesheet.UsedRange.Rows.Count + Activesheet.UsedRange.Row -1 'Last row with a value in it (even if the row is hidden)
答案 4 :(得分:0)
这个怎么样(作为关于XL限制的一种解决方法)。它对循环来说有点长/笨重,但至少循环从第一个可见的最后一个单元开始。
LastRow = DataWorksheet.Range("A:A").Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row
If LastRow <> DataWorksheet.UsedRange.Rows.Count 'assumes data starts in A1, if not adjust acoordingly
'now check if there is anything below
Dim rngSearch as Range
rngSearch = DataWorksheet.Range("A" & LastRow & ":A" & DataWorksheet.UsedRange.Rows.Count)
Dim lngRows as Long, lngCnt as Long
lngRows = rngSearch.Rows.Count
For lngCnt = lngRows to 1 Step -1
If DataWorksheet.Range("A" & lngCnt) = vbNullString And DataWorksheet.Range("A" & lngCnt -1) <> vbNullString Then
LastRow = DataWorksheet.Range("A" & lngCnt-1).Row
End If
Next
End If
答案 5 :(得分:0)
我一直使用这个来获取最后一行,但不是100%确定它适用于隐藏的单元格,但是:)
P.S。确保在测试时更改工作表名称
'VBA to find last row
lngLastRow = ThisWorkbook.Worksheets("Data").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
答案 6 :(得分:0)
Public Function lr(ByVal source As Worksheet, colu As Long) As Long
Dim tmp As Long
tmp = source.Cells(source.Rows.Count, colu).End(xlUp).Row
While source.Cells(tmp + 1, colu).EntireRow.Hidden = True
tmp = tmp + 1
Wend
lr = tmp
End Function