2012-11-15 288 views
1

我有这样的功能:自定义功能

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 

可以说我有一个名为“工作表Sheet1”工作表,在我的excel表,我想能够说= GetLastRowOnSheet(“工作表Sheet”)或用上面的功能,以及包括该一个子例程或函数在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 

想法?

回答

4

您将需要使用此代码来代替:现在

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-功能参数。这就是为什么我使用了一个字符串。

由于您使用的是Resume Next,因此您不需要检查工作表是否实际存在,但如果不是,则必须执行此操作。

但是,您现在可以轻松使用NAMED-Range,只要它指向Worksheet-Name即可。

编辑

好了,找到了一个更好的方式来做到这一点,因为这将是一个痛苦的动态获得worksheetname作为该工作表函数的输入。没有直接执行此操作的内置函数 - 至少我找不到一个函数。 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) 
+0

真棒感谢Jook – ebbflowgo

+0

不错的更新,我所遇到的唯一的另一件事是,该公式不会页面重新计算后复位......不知道为什么,这可能是 – ebbflowgo

+1

这是因为,如果你使用'SheetYX!A1',然后excel不会得到有改变,直到你改变A1。所以使用'SheetXY!A:IV',它会对任何变化做出反应。 – Jook

0

工作表名称不是表对象。

要在工作表NAME中引用工作表OBJECT,可以使用ThisWorkbook.Sheets(工作表名),其中工作表名称是函数参数,类型为字符串,而不是工作表类型。

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

因此,您必须检查两种可能性,并选择一种优先于另一种(因此首先在本地进行检查,如果它已存在,则继续进行全局检查),或者允许用户表示其偏好或在用户的第二个参数必须指定。

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