我有这样的功能:
Function GetLastRowOnSheet(ByVal SheetName As Worksheet) As Long
On Error Resume Next
GetLastRowOnSheet = SheetName.Cells.Find(what:="*", after:=SheetName.Cells(1), searchorder:=xlByRows, searchdirection:=xlPrevious).Row
On Error GoTo 0
End Function
假设我在Excel工作表中有一张名为" Sheet1"的工作表我希望能够说= GetLastRowOnSheet(' Sheet1')或使用命名范围
我可以使用上面的函数以及包含它的子例程或函数在vba中轻松完成此操作:
Dim Sheet1 As Worksheet
Dim LastRow as Long
Set Sheet1 = ThisWorkbook.Sheets("Sheet1")
LastRow = GetLastRowOnSheet(Sheet1)
' last row then returns the last filled in cell on the sheet
思想?
答案 0 :(得分:6)
您需要使用此代码:
Function GetLastRowOnSheet(ByVal SheetName As String) As Long
Dim wks As Worksheet
On Error Resume Next
Set wks = ActiveWorkbook.Worksheets(SheetName)
GetLastRowOnSheet = wks.Cells.Find(what:="*", after:=wks.Cells(1), searchorder:=xlByRows, searchdirection:=xlPrevious).Row
On Error GoTo 0
End Function
我不是100%肯定,但是现在,我非常怀疑,可以将Worksheet-Object作为工作表 - 函数 - 参数传递。这就是我使用字符串的原因。
因为您使用的是Resume Next
,所以您无需检查工作表是否确实存在,但如果没有,则必须这样做。
现在,您可以轻松使用NAMED-Range,只要它引用工作表名称。
修改的
好的,找到了一种更好的方法,因为动态获取工作表名称作为此工作表函数的输入会很痛苦。没有内置函数可以直接执行此操作 - 至少我找不到一个。 Cell("address")
将是最接近的。
Function GetLastRowOnSheet(ByVal SheetName As Range) As Long
On Error Resume Next
With SheetName.Worksheet
GetLastRowOnSheet = .Cells.Find(what:="*", after:=.Cells(1), searchorder:=xlByRows, searchdirection:=xlPrevious).Row
end with
On Error GoTo 0
End Function
现在您可以使用GetLastRowOnSheet(SheetXY!A1)
或GetLastRowOnSheet(NAMEDRANGE)
,这非常简单并且已经有一些防止错误输入的保护。
要将它与VBA一起使用,您可以像这样使用它:
Dim LastRow as Long
LastRow = GetLastRowOnSheet(ThisWorkbook.Sheets("Sheet1").Cells)
答案 1 :(得分:2)
您需要使用Variant类型而不是Worksheet。为我工作。
Function GetLastRowOnSheet(SheetName As Variant) As Long
On Error Resume Next
GetLastRowOnSheet = SheetName.Cells.Find(what:="*", after:=SheetName.Cells(1), searchorder:=xlByRows, searchdirection:=xlPrevious).Row
On Error GoTo 0
End Function
答案 2 :(得分:0)
工作表NAME不是工作表OBJECT。
要使用工作表NAME时引用工作表OBJECT,可以使用ThisWorkbook.Sheets(SheetName),其中SheetName是函数参数,类型为String而不是Worksheet类型。
现在对于一个范围来说,由于命名范围可以是全局(整个工作簿)级别或本地(仅包含工作表)级别,因此会有点困难。
所以你必须检查这两种可能性,或者优先选择另一种(首先在本地检查,如果它确实存在继续全局)或允许用户表达他们的偏好或在用户拥有的第二个参数指定。