viernes, mayo 31, 2013

Encontrar la última celda en una hoja de Excel

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



7 comentarios:

  1. ¡Por fin!
    Me estaba volviendo loca con este tema. Muchas gracias, genial.
    Toñi

    ResponderBorrar
  2. Hola Jorge,
    Cuando 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.

    ResponderBorrar
  3. Hola,

    puedes 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

    ResponderBorrar
  4. Buenos días Maestro:
    Veamos 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.

    ResponderBorrar
  5. Muchas gracias !!! Excelente aportación.

    ResponderBorrar
  6. que es una referencia remota?

    ResponderBorrar
  7. Es una referencia a una celda o rango que s encuentra en otro cuaderno.
    En 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.

    ResponderBorrar

Nota: sólo los miembros de este blog pueden publicar comentarios.