Encontrar la última fila con VBA

Cuando queremos automatizar el ingreso de datos en nuestras hojas de Excel, es inevitable tener la necesidad de encontrar la última fila con valor, de esta manera podremos indicar en nuestro código la fila donde se realizará la inserción.

Existen varios métodos en VBA para encontrar la última fila que contiene datos y hoy te mostraré tres maneras diferentes de hacerlo. Revisaremos cada uno de los métodos para encontrar sus diferencias y sus ventajas.

Descargar archivo de trabajo

Encontrar la última fila con UsedRange

UsedRange es una propiedad del objeto Worksheet y nos devuelve el rango de celdas utilizadas en una hoja.  Por ejemplo, en la siguiente imagen, el rango utilizado es A1:C3.

Encontrar la última fila con VBA

Por el contrario, el rango utilizado en la siguiente imagen es el rango A1:D7.

Última celda con datos en Excel

Una vez que tenemos identificado el rango utilizado, podemos recurrir al método SpecialCells que nos devolverá aquellas celdas que cumplen con determinado criterio. En nuestro ejemplo nos interesa obtener la última celda en uso y por lo tanto utilizaremos la constante xlCellTypeLastCell como el criterio para el método SpecialCells:

ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell)

Lo último que debemos hacer es obtener la fila de esa última celda utilizando la propiedad Row. De esta manera, nuestra macro para obtener la última fila con datos será la siguiente:

Sub UltimaFila_1()
 
    MsgBox ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

End Sub

La siguiente imagen muestra el resultado después de ejecutar esta macro sobre los datos de ejemplo. Observa que el resultado es la fila 7.

Última fila ocupada en una columna

Puedes encontrar problemas cuando tienes algún valor que se encuentre por debajo de las filas de datos ya que eso ocasionará que la macro devuelva una fila mayor a la esperada. Por ejemplo, la siguiente imagen muestra un caso donde las celdas F9 y G9 tienen un valor y por lo tanto la macro devolverá la fila 9 la cual es mayor que la última fila en el rango de datos.

Macro para encontrar la última fila con valor

Si te encuentras en esta situación, entonces debes considerar la alternativa con la propiedad End la cual revisaremos a continuación.

La propiedad End y la última celda con datos

Este método comienza por obtener una referencia a la última celda de una columna utilizando una instrucción como la siguiente:

ActiveSheet.Cells(Rows.Count, "A")

La instrucción Rows.Count nos devuelve el total de filas de la hoja y por lo tanto obtendremos la última celda de la columna A. En seguida utilizaré la propiedad End, que me ayudará a simular el atajo de teclado Fin + Flecha arriba, y con eso puedo “subir” a la última celda con datos de la columna.

ActiveSheet.Cells(Rows.Count, "A").End(xlUp)

Una vez que estamos ubicados en la última celda con datos, podemos obtener su fila con la propiedad Row. El código de nuestra macro es el siguiente:

Sub UltimaFila_2()
 
    MsgBox ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row

End Sub

La siguiente imagen muestra el resultado de ejecutar esta macro sobre los datos de ejemplo. Observa que la macro nos devuelve el valor 10 que es la última fila que tiene un valor.

Última fila de un rango con VBA

La única condición para que este método funcione correctamente es elegir la columna adecuada que nos ayudará a determinar la última fila en los datos.

La única ocasión en la que este método no devolverá el resultado correcto será cuando exista un valor en la última fila de una columna. Pero la probabilidad de que tengas un valor en la fila 1,048,576 es casi inexistente, y por esa razón este método es ampliamente utilizado.

La última fila en uso con Find

Aunque los métodos anteriores funcionan muy bien y son ampliamente utilizados por los programadores de Excel, es muy probable que también encuentres publicada esta última alternativa en los libros de Excel o en Internet.

Este método utiliza el método Find para encontrar la última celda con valor. El primer parámetro del método es la cadena de búsqueda donde colocaremos un asterisco (*) para indicarle que queremos encontrar cualquier valor.

El segundo argumento es la dirección de la búsqueda SearchOrder donde le pediremos que haga una búsqueda por fila. Por último, el parámetro SearchDirection tendrá el valor xlPrevious que le pedirá a Excel encontrar el valor previo. Esto quiere decir que, en una búsqueda hacia atrás, el valor previo será la última celda con un valor. El método Find que utilizaremos será el siguiente:

Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious)

Si combinamos este método con alguna columna de nuestros datos, tendremos el código necesario para obtener la última fila en uso.

Sub UltimaFila_3()
 
    On Error Resume Next
    MsgBox ActiveSheet.Columns("A").Find("*", _
        searchorder:=xlByRows, searchdirection:=xlPrevious).Row

End Sub

La siguiente imagen muestra el resultado al ejecutar esta macro sobre los datos de ejemplo. Considera que existen filas vacías entre los datos y aun así la macro devuelve la última fila correctamente.

Identificar la última fila en uso con VBA

En esta macro he agregado la línea On Error Resume Next porque si la columna está vacía, entonces el método Find devolverá un objeto vacío y por lo tanto causará un error. Es necesario agregar más código en caso de querer manejar adecuadamente dicho error, pero eso será tarea para otra publicación.

Insertar un valor en la primera celda vacía

Para finalizar, haremos un ejemplo práctico donde utilizaremos el código de las secciones anteriores para insertar un valor en la primera celda vacía de una columna. Nuestro objetivo será insertar la hora actual al final de una columna con solo pulsar un botón.

Aunque puedes utilizar cualquiera de las macros de los ejemplos anteriores, he decidido utilizar el método de la propiedad End. Así que, crearé un botón ActiveX y colocaré el siguiente código en su evento Click:

Private Sub CommandButton1_Click()

    Dim ultima As Long
    ultima = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row
    Cells(ultima + 1, 1).Value = Time

End Sub

Después de obtener la última fila con datos, sumamos uno para obtener la primera fila vacía y poder insertar la hora. La siguiente imagen muestra el resultado después de haber pulsado tres veces el botón.

Ir a la última celda con datos