自定义函数使用工作表名称作为参数

时间:2012-11-15 14:30:02

标签: vba excel-vba excel-2007 excel-formula excel-2010

我有这样的功能:

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

思想?

3 个答案:

答案 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类型。

现在对于一个范围来说,由于命名范围可以是全局(整个工作簿)级别或本地(仅包含工作表)级别,因此会有点困难。

所以你必须检查这两种可能性,或者优先选择另一种(首先在本地检查,如果它确实存在继续全局)或允许用户表达他们的偏好或在用户拥有的第二个参数指定。

相关问题