2012-11-15 283 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