Excel 查找最后使用的行的更好方法
我正在尝试以与查找最后一列相同的方式查找最后一行:Excel 查找最后使用的行的更好方法,excel,vba,Excel,Vba,我正在尝试以与查找最后一列相同的方式查找最后一行: Sheets("Sheet2").Cells(1,Sheets("Sheet2").Columns.Count).End(xlToLeft).Column 我知道这种方法,但它没有先前的方法那么有用: u = Sheets("Sheet1").Range("A65536").End(xlUp).Row 我试过: Sheets("Sheet2"
Sheets("Sheet2").Cells(1,Sheets("Sheet2").Columns.Count).End(xlToLeft).Column
我知道这种方法,但它没有先前的方法那么有用:
u = Sheets("Sheet1").Range("A65536").End(xlUp).Row
我试过:
Sheets("Sheet2").Cells(Sheets("Sheet2",1).Rowa.Count).End(xlToUP).Column
简介:最后一排我想要下面的方式
Sheets("Sheet2").Cells(1,Sheets("Sheet2").Columns.Count).End(xlToLeft).Column
您应该使用with语句来限定
行
和列
计数。这将防止在使用较旧的2007年以前版本和较新的2007 Excel工作簿时出现任何错误
最后一栏
With Sheets("Sheet2")
.Cells(1, .Columns.Count).End(xlToLeft).Column
End With
最后一排
With Sheets("Sheet2")
.Range("A" & .Rows.Count).End(xlUp).Row
End With
或
这是怎么回事
dim rownum as integer
dim colnum as integer
dim lstrow as integer
dim lstcol as integer
dim r as range
'finds the last row
lastrow = ActiveSheet.UsedRange.Rows.Count
'finds the last column
lastcol = ActiveSheet.UsedRange.Columns.Count
'sets the range
set r = range(cells(rownum,colnum), cells(lstrow,lstcol))
这是我见过的找到最后一个牢房的最好方法
MsgBox ActiveSheet.UsedRage.SpecialCells(xlCellTypeLastCell).Row
使用这个的缺点之一是它并不总是准确的。如果您使用它,然后删除最后几行并再次使用,它并不总是更新。在使用之前保存工作簿似乎会迫使它更新
在更新表(或刷新向表提供信息的查询)后使用下一位代码会强制在查找最后一行之前更新所有内容。但是,据报道,它使excel崩溃。无论哪种方式,在尝试查找最后一行之前调用此函数都将确保表首先完成更新
Application.CalculateUntilAsyncQueriesDone
如果您不介意开销的话,另一种获取任何给定列的最后一行的方法
Function GetLastRow(col, row)
' col and row are where we will start.
' We will find the last row for the given column.
Do Until ActiveSheet.Cells(row, col) = ""
row = row + 1
Loop
GetLastRow = row
End Function
我使用此例程查找数据行的计数。所需的开销是最小的,但通过使用递减比例进行计数,即使是非常大的结果也需要很少的迭代。例如,28395的结果只需要2+8+3+9+5或27次循环,而不是耗时的28395次 即使我们将其乘以10(283950),迭代次数也是相同的27倍
Dim lWorksheetRecordCountScaler as Long
Dim lWorksheetRecordCount as Long
Const sDataColumn = "A" '<----Set to column that has data in all rows (Code, ID, etc.)
'Count the data records
lWorksheetRecordCountScaler = 100000 'Begin by counting in 100,000-record bites
lWorksheetRecordCount = lWorksheetRecordCountScaler
While lWorksheetRecordCountScaler >= 1
While Sheets("Sheet2").Range(sDataColumn & lWorksheetRecordCount + 2).Formula > " "
lWorksheetRecordCount = lWorksheetRecordCount + lWorksheetRecordCountScaler
Wend
'To the beginning of the previous bite, count 1/10th of the scale from there
lWorksheetRecordCount = lWorksheetRecordCount - lWorksheetRecordCountScaler
lWorksheetRecordCountScaler = lWorksheetRecordCountScaler / 10
Wend
lWorksheetRecordCount = lWorksheetRecordCount + 1 'Final answer
Dim lWorksheetRecordCountScaler尽可能长
Dim L工作表记录计数与长度相同
常数sDataColumn=“A”'=1
While Sheets(“Sheet2”).范围(sDataColumn&lWorksheetRecordCount+2)。公式>“”
lWorksheetRecordCount=lWorksheetRecordCount+lWorksheetRecordCountScaler
温德
“在上一口开始时,从那开始数到刻度的十分之一
lWorksheetRecordCount=lWorksheetRecordCount-lWorksheetRecordCountScaler
lWorksheetRecordCountScaler=lWorksheetRecordCountScaler/10
温德
lWorksheetRecordCount=lWorksheetRecordCount+1'最终答案
如果您要指定特定的工作表,此函数应起作用。我从user6432984获取了解决方案,并对其进行了修改,使其不会抛出任何错误。我使用的是Excel 2016,因此它可能不适用于旧版本:
Function findLastRow(ByVal inputSheet As Worksheet) As Integer
findLastRow = inputSheet.cellS(inputSheet.Rows.Count, 1).End(xlUp).Row
End Function
如果您已经在工作表中工作,要查找最后一行,请运行以下代码:
Dim lastRow as Integer
lastRow = cellS(Rows.Count, 1).End(xlUp).Row
这将提供指定列中最后使用的行 您可以选择指定工作表,否则它将采用活动工作表
Function shtRowCount(colm As Integer, Optional ws As Worksheet) As Long
If ws Is Nothing Then Set ws = ActiveSheet
If ws.Cells(Rows.Count, colm) <> "" Then
shtRowCount = ws.Cells(Rows.Count, colm).Row
Exit Function
End If
shtRowCount = ws.Cells(Rows.Count, colm).Row
If shtRowCount = 1 Then
If ws.Cells(1, colm) = "" Then
shtRowCount = 0
Else
shtRowCount = 1
End If
End If
End Function
Sub test()
Dim lgLastRow As Long
lgLastRow = shtRowCount(2) 'Column B
End Sub
函数shtRowCount(colm作为整数,可选ws作为工作表)的长度
如果ws为Nothing,则设置ws=ActiveSheet
如果ws.Cells(Rows.Count,colm)“,则
shtRowCount=ws.Cells(Rows.Count,colm).Row
退出功能
如果结束
shtRowCount=ws.Cells(Rows.Count,colm).Row
如果shtRowCount=1,则
如果ws.Cells(1,colm)=“那么
shtRowCount=0
其他的
shtRowCount=1
如果结束
如果结束
端函数
子测试()
最后一行一样长
lgLastRow=shtRowCount(2)“B列
端接头
我首选搜索最后一个空白单元格:
如果你想要列的最后一个空单元格,你可以这样做
Dim sh as Worksheet, r as range
set sh = ActiveWorksheet 'if you want an other it's possible
'find a value
'Columns("A:D") 'to check on multiple columns
Set r = sh.Columns("A").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
'no value return first row
If r Is Nothing Then Set r = sh.Cells(1, "A") Else Set r = sh1.Cells(r.Row + 1, "A")
如果要插入新行,则在多列上查找是一个不错的选择,因为第一列包含的行数可能比下一列少我广泛使用以下函数。如上所述,由于使用的范围更新、数据中的间隙或具有不同行计数的不同列,使用其他方法有时会给出不准确的结果 使用示例:
lastRow=FindRange("Sheet1","A1:A1000")
将返回整个范围内最后占用的行号。您可以指定从单列到随机行的任何范围,例如FindRange(“Sheet1”、“A100:A150”)
为什么不使用
Sheets(“Sheet2”).UsedRange.Rows.Count
?请参见此处:但本质上是Sheets(“Sheet2”).Cells(1,Sheets(“Sheet2”).Rows.Count)。End(xlUp)。Row
我使用的for循环会发生变化,因此我需要单元格格式。更改范围对我来说很困难,因为有一个单元格要容易得多。它会返回“运行时错误”1004。对于查找最后一行的两种方法,都不起作用。我不断得到“运行时错误”438:对象不支持这两种属性或方法。此代码返回“1”“在空白纸上,这怎么可能?如果里面没有值,我希望它返回。@smartini,因为此方法返回一行(空或不空),如果包含值,则在行尾返回该行。2种可能性:检查A1=vbnullstring或使用查找方法这三种方法是否都错误。如果最后一列被填充,第一个将返回错误的值,如果最后一行被填充,另外两个将返回错误的值。出于您给出的原因,我不得不不同意您的观点。我发现对特定列/行使用xlUp/xlLeft
方法或对工作表上的最后一个单元格使用Find(“*”
方法是最可靠的方法。@DarrenBartrup Cook我无法在接受的答案中找到适合我的代码。但我发布的代码对我来说效果很好。@DarrenBartrup Cook Find方法有效,但如果所有行都是vbnullstring和.End(xlUp)。行返回最后一行不为空或第一个单元格,则需要测试结果是否为空column@MatthewGoheen这个答案是最简单的。只要该列中间没有空白单元格,它就可以工作。最后一行应该是GetLastRow=行-1?
lastRow=FindRange("Sheet1","A1:A1000")
Public Function FindRange(inSheet As String, inRange As String) As Long
Set fr = ThisWorkbook.Sheets(inSheet).Range(inRange).find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
If Not fr Is Nothing Then FindRange = fr.row Else FindRange = 0
End Function