NOTA : ho intenzione di rendere questo un "posto unico" in cui è possibile utilizzare il Correct
modo per trovare l'ultima riga. Questo coprirà anche le migliori pratiche da seguire quando si trova l'ultima riga. E quindi continuerò ad aggiornarlo ogni volta che trovo un nuovo scenario / informazione.
Modi inaffidabili per trovare l'ultima riga
Alcuni dei modi più comuni per trovare l'ultima riga che sono altamente inaffidabili e quindi non dovrebbero mai essere usati.
- UsedRange
- xlDown
- COUNTA
UsedRange
non dovrebbe MAI essere usato per trovare l'ultima cella che contiene dati. È altamente inaffidabile. Prova questo esperimento.
Digita qualcosa nella cella A5
. Ora quando calcoli l'ultima riga con uno dei metodi indicati di seguito, ti darà 5. Adesso colora la cella in A10
rosso. Se ora usi uno dei seguenti codici, otterrai comunque 5. Se usi Usedrange.Rows.Count
cosa ottieni? Non sarà 5.
Ecco uno scenario per mostrare come UsedRange
funziona.
xlDown
è altrettanto inaffidabile.
Considera questo codice
lastrow = Range("A1").End(xlDown).Row
Cosa succederebbe se ci fosse una sola cella ( A1
) con dati? Finirai per raggiungere l'ultima riga del foglio di lavoro! È come selezionare la cella A1
e quindi premere il Endtasto e quindi premere il Down Arrowtasto. Questo ti darà anche risultati inaffidabili se ci sono celle vuote in un intervallo.
CountA
è anche inaffidabile perché ti darà risultati errati se ci sono celle vuote in mezzo.
E quindi si dovrebbe evitare l'uso di UsedRange
, xlDown
e CountA
per trovare l'ultima cella.
Trova l'ultima riga in una colonna
Per trovare l'ultima riga in Col E usa questo
With Sheets("Sheet1")
LastRow = .Range("E" & .Rows.Count).End(xlUp).Row
End With
Se noti che abbiamo un .
prima Rows.Count
. Spesso abbiamo scelto di ignorarlo. Vedi QUESTA domanda sul possibile errore che potresti ricevere. Consiglio sempre di utilizzare .
prima Rows.Count
e Columns.Count
. Questa domanda è uno scenario classico in cui il codice fallirà perché Rows.Count
restituisce 65536
Excel 2003 e versioni precedenti e 1048576
Excel 2007 e versioni successive. Allo stesso modo Columns.Count
restituisce 256
e 16384
, rispettivamente.
Il fatto sopra che Excel 2007+ ha 1048576
righe sottolinea anche il fatto che dovremmo sempre dichiarare la variabile che conterrà il valore della riga poiché Long
invece di Integer
ottenere un Overflow
errore.
Si noti che questo approccio salterà tutte le righe nascoste. Guardando indietro al mio screenshot qui sopra per la colonna A , se la riga 8 fosse nascosta, questo approccio ritornerebbe 5
invece di 8
.
Trova l'ultima riga in un foglio
Per trovare l' Effective
ultima riga nel foglio, usa questo. Si noti l'uso di Application.WorksheetFunction.CountA(.Cells)
. Questo è necessario perché se non ci sono celle con dati nel foglio di lavoro, allora .Find
ti daràRun Time Error 91: Object Variable or With block variable not set
With Sheets("Sheet1")
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
lastrow = .Cells.Find(What:="*", _
After:=.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
Else
lastrow = 1
End If
End With
Trova l'ultima riga in una tabella (ListObject)
Si applicano gli stessi principi, ad esempio per ottenere l'ultima riga nella terza colonna di una tabella:
Sub FindLastRowInExcelTableColAandB()
Dim lastRow As Long
Dim ws As Worksheet, tbl as ListObject
Set ws = Sheets("Sheet1") 'Modify as needed
'Assuming the name of the table is "Table1", modify as needed
Set tbl = ws.ListObjects("Table1")
With tbl.ListColumns(3).Range
lastrow = .Find(What:="*", _
After:=.Cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
End With
End Sub