You are on page 1of 6

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.

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

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()
1
2
MsgBox
3
ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
4
5
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.
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.

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:

1 Sub UltimaFila_2()
2
3 MsgBox ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row
4
5 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.

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.

1 Sub UltimaFila_3()
2
3 On Error Resume Next
4 MsgBox ActiveSheet.Columns("A").Find("*", _
5 searchorder:=xlByRows, searchdirection:=xlPrevious).Row
6
7 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.
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:

1 Private Sub CommandButton1_Click()


2
3 Dim ultima As Long
4 ultima = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row
5 Cells(ultima + 1, 1).Value = Time
6
7 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.

You might also like