普通方法的问题
空白行/列的帐户 -
如果您的数据开头有空白行或列,则 UsedRange.Rows.Count 和 UsedRange.Columns.Count 等方法将跳过这些空白行(尽管它们确实考虑了可能破坏数据的任何空白行/列),因此如果您参考 ThisWorkbook.Sheets(1).UsedRange.Rows.Count 在工作表顶部有空白行的情况下(例如在此工作表上),您将跳过行:
这将从计数中跳过第一行并返回 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 列中有空白条目,您可能会丢失行,因为代码会从底部找到第一个填充的行 only 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