2012-12-03 9 views
26

Come posso determinare l'ultima riga in un foglio di Excel, comprese alcune righe vuote nel mezzo?Come determinare l'ultima riga utilizzata in VBA inclusi spazi vuoti tra

Con questa funzione:

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 

E questi dati:

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 

La funzione restituisce 5, e ho bisogno 13. Qualsiasi idea di come farlo?

+2

duplicato di [ultima cella non vuota in fila; Excel VBA] (http://stackoverflow.com/questions/4872512/last-not-empty-cell-in-row-excel-vba) – brettdj

+0

Vedere il mio post su https://stackoverflow.com/questions/71180/how -can-i-find-last-row-che-contiene-data-in-the-excel-sheet-with-a-macro/46419169 # 46419169 Penso che possa risolvere la tua richiesta. –

+0

Stranamente, sto usando il seguente codice e funziona anche con le righe vuote tra: 'ActiveSheet.Cells (ActiveSheet.Rows.count, 3) .End (xlUp) .Row' _ (Excel 2016 su MacOS X) _ – KJH

risposta

12

Sei davvero vicino. Provare a utilizzare un gran numero di riga con 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

Hey, grazie, sto testando, Sai perché devo restituire una variante e non una lunga? –

+0

Hmmm Ho provato in un'altra macro e funziona: S –

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

Quella funzione è stata esattamente la stessa della mia funzione. –

13

Io uso il seguente:

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

E troveremo l'ultima riga in una colonna specifica. Se si desidera che l'ultima riga utilizzato per qualsiasi colonna poi:

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

Più affidabile ... Funziona bene anche con 'ClearContents' o rimuovendo i duplicati – Pugazh

51

Il modo migliore per ottenere il numero di ultima riga è utilizzata:

ActiveSheet.UsedRange.Rows.Count per la foglio corrente.

Worksheets("Sheet name").UsedRange.Rows.Count per un foglio specifico .

per ottenere il numero dell'ultima colonna utilizzata:

ActiveSheet.UsedRange.Columns.Count per la foglio corrente.

Worksheets("Sheet name").UsedRange.Columns.Count per un foglio specifico .

Spero che questo aiuti.

Abdo

+1

Grazie. Funziona più veloce come lo so. Lo accetterei come risposta. – Jet

+3

Funziona solo se la prima riga non vuota è la riga 1. – trincot

3

il problema è il "come stringa" nella funzione. Sostituirlo con "come doppio" o "così lungo" per farlo funzionare. In questo modo funziona anche se l'ultima riga è più grande del "numero elevato" proposto nella risposta accettata.

Quindi questo dovrebbe funzionare

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 

breve. Sicuro. Veloce. Restituirà l'ultima riga non vuota anche se ci sono linee vuote sopra il foglio o in qualsiasi altro luogo. Funziona anche per un foglio vuoto (Excel riporta 1 riga usata su un foglio vuoto, quindi l'espressione sarà 1). Testato e funzionante su Excel 2002 ed Excel 2010.

+1

Questa sicuramente deve essere la risposta più accurata. Le risposte del Conteggio presuppongono che stai iniziando dalla prima riga (cioè 1) - ci sono occasioni in cui non lo sei. Questo ti dà l'effettivo indice di riga su cui finisce l'intervallo. Lo accetterei come risposta. – Andez

+0

@manuel la tua affermazione ha fatto il lavoro perfettamente per l'avvio di righe vuote, puoi elaborarlo un po ' – BiLaL

11

Fare attenzione, lo UsedRange.Rows.Count restituisce il numero di righe utilizzato sempre. Se si utilizza 100 righe e quindi clearcontents, lo UsedRange.Row.Count restituisce ancora 100.

-1

ecco il mio codice per trovare la riga vuota successiva ad esempio nella prima riga "A". usarlo per qualsiasi altra riga basta cambiare le cellule (i, 2 o 3 o 4 così via)

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

Beh a parte tutte quelle citate, ci sono molti altri modi per trovare l'ultima riga o colonna in un foglio di lavoro o intervallo specificato.

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 

Nota: Si prega di utilizzare solo uno dei metodi di cui sopra come giustifica la sua dichiarazione problema.

Si prega di prestare attenzione al fatto che il metodo di ricerca non visualizza la cella ma solo i dati, quindi cercare xlCellTypeLastCell se solo i dati sono importanti e non la formattazione. Inoltre, le celle unite (che devono essere evitate) potrebbero fornire risultati imprevisti in quanto forniscono il numero di riga della prima cella e non l'ultima cella nelle celle unite.

-2

Meglio:

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

Questo non fornisce una risposta alla domanda. Una volta che hai [reputazione] sufficiente (https://stackoverflow.com/help/whats-reputation) sarai in grado di [commentare qualsiasi post] (https://stackoverflow.com/help/privileges/comment); invece [fornisci risposte che non richiedono chiarimenti da parte del richiedente] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-, invece). - [Dalla recensione] (/ recensione/post di bassa qualità/18230957) – Mamun

+0

Un po 'tardi alla festa ... anche se sono d'accordo che "Exit For" sarebbe meglio di "GoTo 20" - presumo tu stia rispondendo alla risposta data da @OdiljonJakhangirov. Ma il codice per 'Ctrl + Up' è più veloce come il metodo' Find'. –

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

ActiveSheet può essere sostituito con WorkSheets(1) o WorkSheets("name here")

Problemi correlati