2012-12-03 64 views
26

如何確定Excel工作表中的最後一行,包括中間的空白行?如何確定在VBA中使用的最後一行(包括空格之間的空格)

有了這個功能:

Function ultimaFilaBlanco(col As String) As Long   
     Dim lastRow As Long 
     With ActiveSheet 
      lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, col).End(xlUp).row 
     End With    
     ultimaFilaBlanco = lastRow   
End Function 

而這個數據:

Row 1 : Value 
Row 2 : Value 
Row 3 : Value 
Row 4 : Value 
Row 5 : Value 
Row 6 : White 
Row 7 : Value 
Row 8 : Value 
Row 9 : Value 
Row 10 : White 
Row 11 : White 
Row 12 : White 
Row 13 : Value 
Row 14 : White 

該函數返回5,我需要13.任何想法,該怎麼辦呢?

+2

的重複來代替[在行上次不是空的細胞; Excel的VBA(http://stackoverflow.com/questions/4872512/last-not-empty-cell-in-row-excel-vba) – brettdj

+0

請參見我的文章在https://stackoverflow.com/questions/71180/how -can-i-find-last-row-that-c​​ontains-data-in-the-excel-sheet-with-a-macro/46419169#46419169我認爲它可以解決你的請求。 –

+0

奇怪的是,我運行下面的代碼,並將其與空行之間的工作,即使在:ActiveSheet.Cells(ActiveSheet.Rows.count,3).END(xlUp).Row' '_(EXCEL 2016在MacOS X )_ – KJH

回答

12

你真的很接近。嘗試使用了大量的行號與End(xlUp)

Function ultimaFilaBlanco(col As String) As Long 

     Dim lastRow As Long 
     With ActiveSheet 
      lastRow = ActiveSheet.Cells(1048576, col).End(xlUp).row 
     End With 

     ultimaFilaBlanco = lastRow 

End Function 
+0

嘿,謝謝我的測試,你知道爲什麼我必須返回一個變體,而不是一個很長的? –

+0

嗯,我在另一個宏中測試並工作:S –

4
LastRow = ActiveSheet.UsedRange.Rows.Count 
+3

該功能與我的功能完全相同。 –

13

我使用以下命令:

lastrow = ActiveSheet.Columns("A").Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row 

它會發現最後一排的一個特定的列。如果你想最後使用一行任何柱則:

lastrow = ActiveSheet.Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row 
+0

更可靠...即使使用ClearContents或刪除重複項也能正常工作 – Pugazh

51

習慣最後一行的數字最好的辦法是:

ActiveSheet.UsedRange.Rows.Count電流片

Worksheets("Sheet name").UsedRange.Rows.Count對於特定表

習慣於在最後一欄的數量:

ActiveSheet.UsedRange.Columns.Count電流片

Worksheets("Sheet name").UsedRange.Columns.Count對於特定表

我希望這會有所幫助。

Abdo

+1

謝謝。據我所知,這工作更快。我會接受這個答案。 – Jet

+3

這隻適用於第一個非空白行是第1行的情況。 – trincot

3

問題是函數中的「as string」。將其替換爲「雙倍」或「只要」以使其工作。如果最後一行比接受的答案中提出的「大數」更大,這種方法甚至可以工作。

所以這應該工作

Function ultimaFilaBlanco(col As double) As Long   
    Dim lastRow As Long 
    With ActiveSheet 
     lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, col).End(xlUp).row 
    End With    
    ultimaFilaBlanco = lastRow   
End Function 
11
ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Rows(1).Row -1 

短。安全。快速。即使在工作表頂部或其他任何位置存在空白行,也會返回最後一個非空行。也適用於空白工作表(Excel報告1在空白工作表上使用了行,因此表達式將爲1)。經過測試並在Excel 2002和Excel 2010上工作。

+1

這肯定是最準確的答案。伯爵答案假定你從第一行開始(即1) - 有些情況你不是。這爲您提供了範圍結束時的實際行索引。我會接受這個答案。 – Andez

+0

@manuel你的發言完美地完成了開始空白行的工作,你能不能詳細說明一下 – BiLaL

11

要小心,UsedRange.Rows.Count返回使用的行數有史以來。如果您使用 100行,然後clearcontentsUsedRange.Row.Count仍然返回100。

-1

這裏是我的代碼,找出在第一行「A」下一個空行的例子。 將其用於任何其他行只是改變細胞(I,2或3或4等)

Sheets("Sheeet1").Select 
    for i=1 to 5000 
     if cells(i,1)="" then nextEmpty=i goto 20 
    next i 
20 'continue your code here 

enter code here 
0

所有提到的那些自然分開,還有其他一些方法可以找到在最後的行或列工作表或指定範圍。

Function FindingLastRow(col As String) As Long 

    'PURPOSE: Various ways to find the last row in a column or a range 
    'ASSUMPTION: col is passed as column header name in string data type i.e. "B", "AZ" etc. 

    Dim wks As Worksheet 
    Dim lstRow As Long 

    Set wks = ThisWorkbook.Worksheets("Sheet1") 'Please change the sheet name 
    'Set wks = ActiveSheet 'or for your problem uncomment this line 

    'Method #1: By Finding Last used cell in the worksheet 
    lstRow = wks.Range("A1").SpecialCells(xlCellTypeLastCell).Row 

    'Method #2: Using Table Range 
    lstRow = wks.ListObjects("Table1").Range.Rows.Count 

    'Method #3 : Manual way of selecting last Row : Ctrl + Shift + End 
    lstRow = wks.Cells(wks.Rows.Count, col).End(xlUp).Row 

    'Method #4: By using UsedRange 
    wks.UsedRange 'Refresh UsedRange 
    lstRow = wks.UsedRange.Rows(wks.UsedRange.Rows.Count).Row 

    'Method #5: Using Named Range 
    lstRow = wks.Range("MyNamedRange").Rows.Count 

    'Method #6: Ctrl + Shift + Down (Range should be the first cell in data set) 
    lstRow = wks.Range("A1").CurrentRegion.Rows.Count 

    'Method #7: Using Range.Find method 
    lstRow = wks.Column(col).Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row 

    FindingLastRow = lstRow 

End Function 

注意:因爲它證明您的問題聲明請只用上面的方法之一。

請注意,查找方法沒有看到單元格格式,但只有數據,因此只查找xlCellTypeLastCell(如果數據很重要而不格式化)。另外,合併的單元格(必須避免)可能會給您帶來意想不到的結果,因爲它會爲您提供第一個單元格的行號,而不是合併單元格中的最後一個單元格。

-2

更好:

if cells(i,1)="" then 
nextEmpty=i: 
exit for 
+0

這並沒有提供問題的答案。一旦你有足夠的[聲譽](https://stackoverflow.com/help/whats-reputation),你將可以[對任何帖子發表評論](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/ review/low-quality-posts/18230957) – Mamun

+0

晚了點派對....雖然我同意'退出For'會比'GoTo 20'更好 - 我假設你正在迴應到@OdiljonJakhangirov給出的答案。但是'Ctrl + Up'的代碼和'Find'方法一樣快。 –

0
ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.count).row 

ActiveSheet可以與WorkSheets(1)WorkSheets("name here")

相關問題