NOTA : Tengo la intención de hacer de esto una "publicación única" en la que pueda usar la Correct
forma de encontrar la última fila. Esto también cubrirá las mejores prácticas a seguir al encontrar la última fila. Y, por lo tanto, seguiré actualizándolo cada vez que encuentre un nuevo escenario / información.
Formas poco confiables de encontrar la última fila
Algunas de las formas más comunes de encontrar la última fila son muy poco confiables y, por lo tanto, nunca deben usarse.
- Rango utilizado
- xlDown
- CountA
UsedRange
debe NUNCA ser utilizado para encontrar la última celda que tiene datos. Es muy poco confiable. Prueba este experimento.
Escribe algo en la celda A5
. Ahora, cuando calcules la última fila con cualquiera de los métodos que figuran a continuación, te dará 5. Ahora colorea la celda de A10
rojo. Si ahora usa cualquiera de los siguientes códigos, todavía obtendrá 5. Si usa, Usedrange.Rows.Count
¿qué obtiene? No serán las 5.
Aquí hay un escenario para mostrar cómo UsedRange
funciona.
xlDown
Es igualmente poco confiable.
Considera este código
lastrow = Range("A1").End(xlDown).Row
¿Qué pasaría si solo hubiera una celda ( A1
) que tuviera datos? ¡Terminarás llegando a la última fila de la hoja de trabajo! Es como seleccionar la celda A1
y luego presionar la Endtecla y luego presionar la Down Arrowtecla. Esto también le dará resultados poco confiables si hay celdas en blanco en un rango.
CountA
tampoco es confiable porque le dará un resultado incorrecto si hay celdas en blanco en el medio.
Y por lo tanto, uno debe evitar el uso de UsedRange
, xlDown
y CountA
encontrar la última celda.
Encuentra la última fila en una columna
Para encontrar la última fila en la columna E, use esto
With Sheets("Sheet1")
LastRow = .Range("E" & .Rows.Count).End(xlUp).Row
End With
Si notas que tenemos un .
antes Rows.Count
. A menudo elegimos ignorar eso. Vea ESTA pregunta sobre el posible error que puede obtener. Siempre aconsejo usar .
antes Rows.Count
y Columns.Count
. Esa pregunta es un escenario clásico donde el código fallará porque los Rows.Count
retornos 65536
para Excel 2003 y anteriores y 1048576
para Excel 2007 y posteriores. Del mismo modo Columns.Count
vuelve 256
y 16384
, respectivamente.
El hecho anterior de que Excel 2007+ tiene 1048576
filas también enfatiza el hecho de que siempre debemos declarar la variable que contendrá el valor de la fila, ya que en Long
lugar de Integer
eso obtendrá un Overflow
error.
Tenga en cuenta que este enfoque omitirá las filas ocultas. Mirando hacia atrás en mi captura de pantalla anterior para la columna A , si la fila 8 estuviera oculta, este enfoque volvería en 5
lugar de hacerlo 8
.
Encuentra la última fila en una hoja
Para encontrar la Effective
última fila en la hoja, use esto. Observe el uso de Application.WorksheetFunction.CountA(.Cells)
. Esto es necesario porque si no hay celdas con datos en la hoja de trabajo, .Find
le 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
Buscar la última fila en una tabla (ListObject)
Se aplican los mismos principios, por ejemplo, para obtener la última fila en la tercera columna de una tabla:
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