为什么你的方法不起作用:这里有两个原因。第一个,当你放Rows.Count
,没有参考Rows
- 它是一个属性Range
。要修复它,你只需要引用你已经存在的相同范围(只需在你调用之前附加它Rows.Count
:
Function FindLastDataLine(strColName As String) As Long
FindLastDataLine = Range(strColName).Offset(Range(strColName).Rows.Count - 1, 0).End(xlUp).Row
End Function
第二个原因是你正在使用Offset
。 Offset
字面意思是Range
根据你说的多少来改变。您不希望移动整个范围的单元格,而是查找范围中的最后一个单元格。您可以通过更改Offset
为Cells
删除初始Range()
调用(因为我们将选择一个单元格)并更改0
为您想要的列来完成此操作。但是,因为您将列传递为"A:A"
,这是不可能的,所以您必须使用Range(strColName).Column
以下内容替换它:
Function FindLastDataLine(strColName As String) As Long
FindLastDataLine = Cells(Range(strColName).Rows.Count, Range(strColName).Column).End(xlUp).Row
End Function
更好的解决方案:以下解决方案适用于所有最新版本的MS Office(2003,2007和2010),并将处理错误。您可以通过传递列字母或列号来调用它:
Function GetLastDataRow(col As Variant) As Long
GetLastDataRow = -1
If (IsNumeric(col) And col >= 1) Or Len(col) <= 2 Then
On Error Resume Next
GetLastDataRow = _
Cells(Cells(1, col).EntireColumn.Rows.Count, col).End(xlUp).Row
On Error GoTo 0
End If
End Function
以下说明了如何调用此函数以及一些示例输出。让我们假设整个页面清晰,除了在单元格中输入一些随机数据B1
,以B8
和B10
(B9
留空)。请注意,不要将列作为范围输入,而是输入列字母或列号(无效值返回-1):
GetLastDataRow(1) = 1 GetLastDataRow("A") = 1
GetLastDataRow(2) = 10 GetLastDataRow("B") = 10
GetLastDataRow("AX") = 1 GetLastDataRow("A:X") = -1
GetLastDataRow("Oops...") = -1 GetLastDataRow(200) = 1
作为技术说明,如果Cells
方法失败,则假定输入无效,因此函数返回-1。我建议你在函数中使用这种做法(如果输入无效则返回无效值),它将极大地帮助你避免将来出现错误。
如何工作,它找到任何特定列中的最后一行(取决于您的MS Office版本),然后使用该End
方法查找该列中包含数据的最后一个单元格。
这是一个替代版本,如果该列中的所有单元格都为空,则返回0:
Function GetLastDataRow(col As Variant) As Long
GetLastDataRow = -1
If (IsNumeric(col) And col >= 1) Or Len(col) <= 2 Then
On Error Resume Next
If IsEmpty(Cells(Cells(1, col).EntireColumn.Rows.Count, col).End(xlUp).Value) Then
GetLastDataRow = 0
Else
GetLastDataRow = _
Cells(Cells(1, col).EntireColumn.Rows.Count, col).End(xlUp).Row
End If
On Error GoTo 0
End If
End Function
示例输出:
GetLastDataRow(1) = 0 GetLastDataRow("A") = 0
GetLastDataRow(2) = 10 GetLastDataRow("B") = 10
GetLastDataRow("AX") = 0 GetLastDataRow("A:X") = -1
GetLastDataRow("Oops...") = -1 GetLastDataRow(200) = 0
Option Explicit
在代码顶部使用,并显式声明变量。我不能说实践作为程序员是多么重要。