Una de las tareas frecuentes al escribir código Vba, muchas veces al modificar código de una macro grabada, es tener que determinar la última fila (o celda o columna) usada en la hoja.
Si nos basamos en una macro que hemos grabado al usar el método Ir-Especial-Última celda,
veremos esta sentencia
Range("A1").SpecialCells(xlCellTypeLastCell).Select
El problema con este método es que Excel recalcula la ubicación de la última celda usada sólo cuando guardamos el archivo. Esto significa que si ingresamos un valor en una celda remota y luego lo borramos, Excel seguirá considerando esa celda como la última. Y como si esto no fuera poco, también si cambiamos el formato de una celda remota, aún si ingresar ningún valor, Excel la considerará la última celda usada.
Para asegurarnos de encontrar siempre la última celda usada, es decir, la celda más remota que contiene algún valor, tenemos que usar un código basado en el método Range.Find
Sub ultima_celda()
Dim UltimaFila As Long
If WorksheetFunction.CountA(Cells) > 0 Then
UltimaFila = Cells.Find(What:="*", After:=[A1], _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
MsgBox UltimaFila, vbInformation, "Ultima fila"
End If
End Sub
Este código encuentra la última celda y nos informa cuál es la fila con un mensaje.
Este video nos muestra la diferencia entre ambos métodos
¡Por fin!
ResponderBorrarMe estaba volviendo loca con este tema. Muchas gracias, genial.
Toñi
Hola Jorge,
ResponderBorrarCuando se fuerza a que Excel cuente las filas del rango UsedRange dentro de una hoja, Excel vuelve a ajustar el valor de la última celda al rango realmente utilizado.
UltimaFila = Worksheets(1).UsedRange.Rows.Count
Lo único que hay que tener en cuenta es que si tenemos alguna fila "no usada" al inicio de la hoja, UsedRange no la tendrá en cuenta por lo que habrá que sumarla a UltimaFila.
Hola,
ResponderBorrarpuedes superar el problema de las filas al inicio de la hoja usando el método Range.SpecialCells de esta manera
Sub ultima_celda3()
Dim ultima_fila As Long
With ActiveSheet
.UsedRange
ultima_fila = Cells.SpecialCells(xlCellTypeLastCell).Row
End With
MsgBox ultima_fila, vbInformation
End Sub
El problema con estos métodos es que si aplicas formato a alguna celda remota, como señalo en la nota, la última fila no será la de la última celda que contiene algún valor.
Este último problema se soluciona con Cells.Find
Buenos días Maestro:
ResponderBorrarVeamos si estoy bien, para llegar a la última celda con captura o con un formato tecleo CTRL+FIN y en efecto me envía a la última celda, lo que hago es eliminar las filas y/o columnas que hay en blanco y después guardo cambios; esto para quitar peso al archivo, más aún he detectado que por esta causa se nos vuelve el archivo más pesado y/o lento y creo pensamos erróneamente que el problema reside en otras cosas (cálculo, tablas, formularios, etc.).
Creo es importante depurar nuestras hojas para acelerar la carga y descarga de archivos y por último sugiero humildemente utilizar la extensión .xlsb (binario) a mi me ha dado gran resultado.
Saludos y buen día desde México.
Muchas gracias !!! Excelente aportación.
ResponderBorrarque es una referencia remota?
ResponderBorrarEs una referencia a una celda o rango que s encuentra en otro cuaderno.
ResponderBorrarEn la barra de las fórmulas aparecen antecedidos por el noombre del cuaderno remoto. Así por ejemplo, en el cuaderno activo veremos en la barra de las fórmulas algo así como =[CuadernoRemoto.xlsx]!$A$1.