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