Excel Avanzado

Macros, Vba en Excel y muchos ejemplos de nuestro Curso de Excel Avanzado

Excel Avanzado

Identificar la última fila en uso con VBA

| 50 comentarios

¿En qué nos ayudaría identificar la última fila en uso?

Usualmente las bases de datos en Excel tienen mucha información; por eso,  perderíamos tiempo buscando el último dato con la barra de desplazamiento.
Sin embargo, esto se puede solucionar, haciendo uso de las macros.

¿Qué código podemos usar para buscar la última fila?

Sub BuscarUltimaFila()

Dim ult As Integer
ult = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox ult

End Sub

Ahora entendamos el código:

Cells(Rows.Count,1) = Al usar Rows.Count estamos contando todas las filas disponibles en excel cuyo valor seria 1048576. Como lo usamos en un Cells, estaremos seleccionando la fila 1048576. El "1" indica la columna en la cuál se esta trabajando ("A") .

End(xlUp) = Estamos indicando que desde la fila indicada (1048576), "suba" hasta que encuentre un valor.

Row = Indicamos que grabe el número de la fila ocupada encontrada.

MsgBox ult = Mostramos ese valor en un cuadro de texto.

 

Seleccionar la última fila en VBA

Ahora, si queremos seleccionar esa celda podemos agregar el siguiente código:

Sub BuscarUltimaFila()

Dim n As Long
countult = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox countult
Cells(Rows.Count, 1).End(xlUp).Select

End Sub

Como podemos observar, en vez de .Row , le ponemos .Select

Última fila libre en VBA

Alternativamente, si queremos buscar la última fila libre, haremos uso del Offset:

Sub BuscarUltimaFila()

Dim n As Long
countult = Cells(Rows.Count, 1).End(xlUp).Offset(1,0).Row
MsgBox countult
Cells(Rows.Count, 1).End(xlUp).Offset(1,0).Select

End Sub

Con Offset(1,0) , al encontrar la última fila en uso, saltamos 1 fila más la cual sería la última fila libre.

Descargar ejemplos de identificación de última fila

------------------

Elaborado por: Daniel Eduardo Espinoza Rodriguez

50 comentarios

  1. Excelente, me ayudo mucho

  2. Espero su apoyo porfavor quisiera saber como ocupar una celda determina
    en este codigo ya que si me lista pero desde la ultima celda activa y yo necesito que este en la celda A22 para abajo

    conta = 0
    Set a = Sheets("REQUERIMIENTO")
    filaedit = a.Range("A" & Rows.Count).End(xlUp).Row + 1
    For x = 0 To Me.ListBox1.ListCount - 1
    If Me.ListBox1.Selected(x) = True Then
    conta = conta + 1
    End If
    Next x
    If conta 0 Then
    For x = 0 To Me.ListBox1.ListCount - 1
    If Me.ListBox1.Selected(x) = True Then
    'fila = Me.ListBox1.ListIndex.SelectedItem
    a.Cells(filaedit, "A") = ListBox1.List(x, 0)
    a.Cells(filaedit, "B") = ListBox1.List(x, 1)
    a.Cells(filaedit, "C") = ListBox1.List(x, 2)
    a.Cells(filaedit, "E") = ListBox1.List(x, 4)
    a.Cells(filaedit, "F") = ListBox1.List(x, 3)
    Me.ListBox1.Selected(x) = False
    filaedit = filaedit + 1
    conta = conta + 1
    End If
    Next x
    End If
    End Sub

  3. Muchas gracias, me fue de mucha utilidad esta publicacion

  4. Que bueno el código, necesito determinar la ultima fila de una litado, a cual deberá ser evaluada y si cumple una condición toda la fila será copiada a la ultima fila libre de otra hoja. p.e. listado de nombres, edades, ciudad. si el dato ingresado es de una edad determinada, esta fila deberá ser copiada a la hoja 2, en la fila disponible siguiente a la ultima fila ocupada. esto al momento de ingresar la edad. gracias por su ayuda.

  5. Buenas días, tengo una macro que realiza la copia de datos desde otro libro pero siguiendo una condición especifica, el problema que tengo es ¿como puedo determinar la ultima fila en ese libro sin abrirlo?.

    El libro de trabajo no tiene dato por lo que el código me arroja el valor de la ultima fila en 1 siendo la ultima fila desde el libro a copiar 10562.

    Sub Importar()
    Dim LibroDatos As Variant
    Dim UltimaFila As Integer

    LibroDatos = Application.GetOpenFilename("Hoja Excel, *.xls*", _
    , Title:="Seleccionar Archivo para Copiar Datos.")

    UltimaFila = Cells(Rows.Count, 1).End(xlUp).Offset(1)

    End Sub

    ¿Podrían Ayudarme Por Favor?

    • Hola JavierM,

      ¡No se puede determinar la última fila sin abrir el archivo!….Excel requiere que los libros estén abiertos y sus hojas visibles, es independiente del método que utilices, siempre terminaras abriendo los archivos para poder copiar su información.

      El método GettOpenFilename , solo te servirá si lo acompañas del método Workbooks.Open ..…..ok

      Así mismo la instrucción.

      UltimaFila = Cells(Rows.Count, 1).End(xlUp).Row

      Carece de significado, si el libro “NO ESTÁ ABIERTO”……así son las reglas de VBA….solo hay que utilizarlas a nuestro favor…. ok

      Saludos.

    • Javier...Interesante, pero el comando UltimaFila = Cells(Rows.Count, 1).End(xlUp).Offset(1), sobre escribe mas no me busca la ultima fila libre...

  6. Hola buenas tardes, necesito necesito Concatenar A segun nombres de columna B esto debe ir en columna D segun los nombres de los clientes de columna D .
    Debe ser con VBA porque son alrededor de 300 filas de nombres y unos 200 clientes

    A B C D
    Numeros Nombres Clientes Numeros
    567 juan juan 567-44-789-2379
    45 roberto roberto 45-555-211
    555 roberto jose 343-123-14
    44 juan
    jose
    789 juan
    343 jose
    juan
    123 jose
    2379 juan
    14 jose
    roberto
    211 roberto

    • Hola recién veo este post y seguro que ya lo has hecho pero por las dudas debes hacer lo siguiente:

      Seleccionas toda la tabla y vas a datos y seleccionas crear tabla. Le das un nombre a la tabla y seleccionas la opción de "contiene encabezado" y aceptas todo.

      Una vez echo esto te vas a la primera celda de la columna D y colocas lo siguiente: =A2&"-"&B2

      Al colocar está fórmula en la primera celda se pega en toda la tabla de esa celda. Evitando así de colocar la fórmula celda por celda.

  7. Buenas tardes, Excelente aporte, pero necesito que la macro me identifique la ultima fila con texto en otra hoja llamada "BASE" y traerlo a la hoja "Generador" en la celda A4.

    Muchas gracias.

  8. GRAN APORTACION!
    ME SIRVIO PARA UN TRABAJO QUE ESTOY DESARROLLANDO

  9. como puedo corregir un error 1004 en esta linea
    contfila = hoja.Cells(Rows.Count, 1).End(x1up).Offset(1, 0).Row

    • contfila = Cells(Rows.Count, 1).End(xlUp).Row
      contfila = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row
      contfila = Worksheets("ventas").Cells(Rows.Count, 1).End(xlUp).Row
      (revisar x1up por xlup)

  10. Hola estoy haciendo un formulario de ingreso de datos de postulantes me guarda todo correcto y también he probado con macros el orden de mérito de las notas pero cuando lo.quiero adaptar en mi proyecto no me calcula como lo deseo me pueden ayudar

  11. Así es como se debe de explicar VBA, cada código. El mejor de los aportes que he visto

  12. buenos dias, estoy armando un formulario en excel y tome como ejemplo un vídeo de programación que me agrega una fila pero se me enciman los datos, el formulario que arme ocupa de forma variable entre 3 y 4 filas por solicitud y necesito que cuando agrego un dato nuevo comience desde la ultima. les muestro como lo escribí.
    Private Sub AGREGAR_Click()
    Worksheets("Planilla").Range("a2").EntireRow.Insert
    Range("B2") = SOLICITUD.Value
    Range("H2") = FECHAVENTA.Value
    Range("K2") = VENDEDOR.Value
    Range("M2") = MEDIO.Value
    Range("N2") = TEMISORA.Value
    Range("O2") = NTARJETA.Value
    Range("R2") = NCBU.Value
    Range("B3") = SOLICITUD.Value
    Range("E3") = DNITITU.Value
    Range("G3") = APELLIDOTITU.Value
    Range("H3") = NOMBRETITU.Value
    Range("I3") = NACTITU.Value
    Range("J3") = SEXOTITU.Value
    Range("L3") = CALLE.Value
    Range("M3") = NUMERO.Value
    Range("N3") = PISO.Value
    Range("O3") = DTO.Value
    Range("P3") = LOCALIDAD.Value
    Range("Q3") = CP.Value
    Range("R3") = PROV.Value
    Range("S3") = TELEFONO.Value
    Range("V3") = EMAIL.Value
    Range("E4") = DNI1.Value
    Range("F4") = PAREN1.Value
    Range("G4") = APELLIDO1.Value
    Range("H4") = NOMBRE1.Value
    Range("I4") = NAC1.Value
    Range("J4") = SEXO1.Value
    Range("E5") = DNI2.Value
    Range("F5") = PAREN2.Value
    Range("G5") = APELLIDO2.Value
    Range("H5") = NOMBRE2.Value
    Range("I5") = NAC2.Value
    Range("J5") = SEXO2.Value
    Range("E6") = DNI3.Value
    Range("F6") = PAREN3.Value
    Range("G6") = APELLIDO3.Value
    Range("H6") = NOMBRE3.Value
    Range("I6") = NAC3.Value
    Range("J6") = SEXO3.Value
    Range("E7") = DNI4.Value
    Range("F7") = PAREN4.Value
    Range("G7") = APELLIDO4.Value
    Range("H7") = NOMBRE4.Value
    Range("I7") = NAC4.Value
    Range("J7") = SEXO4.Value
    Range("E8") = DNI5.Value
    Range("F8") = PAREN5.Value
    Range("G8") = APELLIDO5.Value
    Range("H8") = NOMBRE5.Value
    Range("I8") = NAC5.Value
    Range("J8") = SEXO5.Value
    FECHAVENTA = Empty
    VENDEDOR = Empty
    SOLICITUD = Empty
    IDUSUARIO = Empty
    DNITITU = Empty
    NOMBRETITU = Empty
    APELLIDOTITU = Empty
    SEXOTITU = Empty
    NACTITU = Empty
    PAREN1 = Empty
    NOMBRE1 = Empty
    APELLIDO1 = Empty
    DNI1 = Empty
    SEXO1 = Empty
    NAC1 = Empty
    PAREN2 = Empty
    NOMBRE2 = Empty
    APELLIDO2 = Empty
    DNI2 = Empty
    SEXO2 = Empty
    NAC2 = Empty
    PAREN3 = Empty
    NOMBRE3 = Empty
    APELLIDO3 = Empty
    DNI3 = Empty
    SEXO3 = Empty
    NAC3 = Empty
    PAREN4 = Empty
    NOMBRE4 = Empty
    APELLIDO4 = Empty
    DNI4 = Empty
    SEXO4 = Empty
    NAC4 = Empty
    PAREN5 = Empty
    NOMBRE5 = Empty
    APELLIDO5 = Empty
    DNI5 = Empty
    SEXO5 = Empty
    NAC5 = Empty
    TELEFONO = Empty
    EMAIL = Empty
    CALLE = Empty
    NUMERO = Empty
    PISO = Empty
    DTO = Empty
    LOCALIDAD = Empty
    CP = Empty
    PROV = Empty
    MEDIO = Empty
    TEMISORA = Empty
    NTARJETA = Empty
    NCBU = Empty
    FECHAVENTA.SetFocus

    End Sub

    les agradeceria mucho si me dan una mano, mil gracias

  13. Hola escribo el mismo código y sin embargo marca error, pero cuando copio y pego el código que bajo de tu archivo (que es exactamente igual al que nos compartes, únicamente que el nombre de la variable cambia) ese si corre. A que se deberá????

  14. Excelente
    mil Gracias

  15. Buenas.

    Tengo un problema. Si la tabla tiene hasta 32.667 registros me lo hace perfectamente. Pero con más celdas, el procedimiento me casca en la línea:

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

    UltFilaTC está declarado como INTEGER, por ahí no hay problema.Asi que entiendo que no puede devolver un entero, sino un SHORT

    Gracias de antemano.

    • Si UltFilaTC está declarado como INTEGER, solo puede almacenar valores entre -32768 y 32767. Deberías convertirlo en LONG (-2,147,483,648 a 2,147,483,647)

  16. Buenas tardes, tengo una duda y quisiera ver si me pueden ayudar.
    Tengo una tabla de la cual me interesa copiar los datos vacíos a otra hoja y no se como hacerlo, la macro que hice me copia las celdas que comtienen datos y quiero copiar las que no tengan datos.
    Les adjunto las lineas de la macro:
    Sub validardatoscompletos()

    Dim ultimafilaEEE As Long
    Dim ultimafilaDC As Long
    Dim RSV, ID_NOMBRE, F_SALIDA, V_SALIDA, F_REGRESO, CLASE_REGRESO, COMENTARIOS, PRECIO, COMP, FECHA As String
    Dim cont As Long

    ultimafilaEEE = Sheets("EEE").Cells(Rows.Count, 4).End(xlUp).Row
    ultimafilaDC = Sheets("DATOS_COMPLETOS").Cells(Rows.Count, 4).End(xlUp).Row

    For cont = 7 To ultimafilaEEE
    RSV = Trim(Sheets("EEE").Cells(cont, 4))
    ID_NOMBRE = Trim(Sheets("EEE").Cells(cont, 5))
    F_SALIDA = Trim(Sheets("EEE").Cells(cont, 6))
    V_SALIDA = Trim(Sheets("EEE").Cells(cont, 7))
    F_REGRESO = Trim(Sheets("EEE").Cells(cont, 8))
    CLASE_REGRESO = Trim(Sheets("EEE").Cells(cont, 9))
    COMENTARIOS = Trim(Sheets("EEE").Cells(cont, 10))
    PRECIO = Trim(Sheets("EEE").Cells(cont, 11))
    COMP = Trim(Sheets("EEE").Cells(cont, 12))
    FECHA = Trim(Sheets("EEE").Cells(cont, 13))

    If Len(RSV) > 0 And Len(ID_NOMBRE) > 0 And Len(F_SALIDA) > 0 And Len(V_SALIDA) > 0 And Len(F_REGRESO) > o And Len(CLASE_REGRESO) > 0 And Len(COMENTARIOS) > 0 And Len(PRECIO) > 0 And Len(COMP) > 0 And Len(FECHA) > 0 Then

    ultimafilaDC = ultimafilaDC + 1
    Sheets("DATOS_COMPLETOS").Cells(ultimafilaDC, 4) = RSV
    Sheets("DATOS_COMPLETOS").Cells(ultimafilaDC, 5) = ID_NOMBRE
    Sheets("DATOS_COMPLETOS").Cells(ultimafilaDC, 6) = F_SALIDA
    Sheets("DATOS_COMPLETOS").Cells(ultimafilaDC, 7) = V_SALIDA
    Sheets("DATOS_COMPLETOS").Cells(ultimafilaDC, 8) = F_REGRESO
    Sheets("DATOS_COMPLETOS").Cells(ultimafilaDC, 9) = CLASE_REGRESO
    Sheets("DATOS_COMPLETOS").Cells(ultimafilaDC, 10) = COMENTARIOS
    Sheets("DATOS_COMPLETOS").Cells(ultimafilaDC, 11) = PRECIO
    Sheets("DATOS_COMPLETOS").Cells(ultimafilaDC, 12) = COMP
    Sheets("DATOS_COMPLETOS").Cells(ultimafilaDC, 13) = FECHA
    Sheets("EEE").Cells(cont, 14) = "SI"
    Else
    Sheets("EEE").Cells(cont, 14) = "NO"

    End If
    Next cont
    MsgBox "Proceso de copiado terminado exitosamente!", vbInformation, "Resultado"

    End Sub

  17. Buen dia, me podria ayudar

    Tengo una tabla deseo encontrar la primera celda vacia, que este dentro de la tabla, que no necesariamente sea la ultima.

    cual seria el codigo?

Página de comentarios 2 de 2
1 2

Deja una respuesta

Los campos requeridos estan marcados con *.