查找上次使用的行的更好方法

时间:2016-08-10 19:50:53

标签: excel vba

我正试图找到最后一行找到最后一行:

Sheets("Sheet2").Cells(1,Sheets("Sheet2").Columns.Count).End(xlToLeft).Column`enter code here`

我知道如何以这种方式做到这一点,但它没有以前那样有用:

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`enter code here`

9 个答案:

答案 0 :(得分:10)

您应该使用with语句来限定RowsColumns计数。这样可以防止在使用较旧的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 

With Sheets("Sheet2")
    .Cells(.Rows.Count, 1).End(xlUp).Row
End With 

答案 1 :(得分:1)

这将为您提供指定列中最后使用的行。

(可选)您可以指定工作表,否则将需要活动工作表。

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

答案 2 :(得分:0)

这是我见过的找到最后一个单元格的最佳方法。

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

答案 3 :(得分:0)

我使用此例程来查找数据行数。所需的开销最少,但是通过使用递减的比例进行计数,即使很大的结果也需要很少的迭代。例如,结果为28,395只需要2 + 8 + 3 + 9 + 5,或整个循环27次,而不是耗时的28,395次。

即使我们将其乘以10(283,950),迭代次数也相同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

答案 4 :(得分:0)

如果您要指定特定的图纸,则此功能可以解决问题。我从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

答案 5 :(得分:0)

我希望搜索最后一个空白单元格:

如果您想要该列的最后一个空单元格,您可以这样做

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")

如果这是要插入新行,那么在多列上查找是一个不错的选择,因为第一列可以包含比第二列更少的行

答案 6 :(得分:0)

我广泛使用以下功能。如上所述,由于使用了范围更新,数据中的空白或具有不同行数的不同列,使用其他方法有时可能会得出不正确的结果。

使用示例:

lastRow=FindRange("Sheet1","A1:A1000")

将返回整个范围的最后一个被占用的行号。您可以指定任意范围,从单列到随机行,例如FindRange(“ Sheet1”,“ A100:A150”)

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

答案 7 :(得分:0)

普通方法的问题

空白行/列的帐户 - 如果数据开头有空白行或列,那么 UsedRange.Rows.Count 和 UsedRange.Columns.Count 等方法将跳过这些空白行(尽管它们确实考虑了可能会破坏数据的任何空白行/列),因此如果您参考 ThisWorkbook.Sheets(1).UsedRange.Rows.Count 您将在工作表顶部有空白行的情况下跳过行,例如在此工作表上:

Example Sheet with Blank Top Row

这将跳过计数的第一行并返回 11:

ThisWorkbook.Sheets(1).UsedRange.Rows.Count

此代码将包含空白行并返回 12:

ThisWorkbook.Sheets(1).UsedRange.Cells(ThisWorkbook.Sheets(1).UsedRange.Rows.Count, 1).Row

同样的问题也适用于列。

完整的表格 - 如果您的工作表已满,则识别最后一行或最后一列可能会很困难(这仅在您的数据包含超过一百万行或数据的最后一行或几列中可能有值时才重要)。例如,如果您使用 xlEndUp 或类似方法并且您所指的单元格已填充,则代码将跳过数据,在极端情况下,如果数据从工作表的最后一行继续,则可以跳过整个数据集(您开始 xlEndUp 的地方)一直到第一行(在这种情况下,结果将为 1)。

'This code works, but... 
'Will not function as intended if there is data in the cell you start with (Cell A:1048576).
Dim Sht1 as Range: Set Sht1 = ThisWorkbook.Sheets(1)
Sht1.Cells(Sht1.Rows.Count, 1).End(xlUp).Row

带有空行的列 - 上面的代码还假设您的数据沿第 1 列向下延伸,如果第 1 列中有空白条目,您可能会丢失行,因为代码将在列中找到底部的第一个填充行1.

不必要的循环 - 不言自明,最好尽可能避免循环,就好像您正在处理大量数据并且经常重复循环过程会减慢您的代码速度。

解决方案

请注意,这是为了在整个工作表上查找最后一个“已使用”行或列,如果您只想要特定范围内的最后一个单元格,这将不起作用。

我在这里设置了一些功能

Private Function GetLastRow(Sheet As Worksheet)
'Gets last used row # on sheet.
GetLastRow = Sheet.UsedRange.Cells(Sheet.UsedRange.Rows.Count, 1).Row
End Function

Private Function GetLastCol(Sheet As Worksheet)
'Gets last used column # on sheet.
GetLastCol = Sheet.UsedRange.Cells(1, Sheet.UsedRange.Columns.Count).Column
End Function

调用这些函数的示例:

Sub CallFunctions()
    'Define the Target Worksheet  we're interested in:
    Dim Sht1 As Worksheet: Set Sht1 = ThisWorkbook.Sheets(1)
    'Print the last row and column numbers:
    Debug.Print "Last Row = "; GetLastRow(Sht1)
    Debug.Print "Last Col = "; GetLastCol(Sht1)
End Sub

答案 8 :(得分:-2)

这怎么样?

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))
相关问题