Saltar al contenido

UDF "Ultima Fila Ocupada"


verzulsan

Recommended Posts

publicado

A pesar de haber ya decenas de versiones de funciones que hacen algo similar, os dejo aquí una de mi propia cosecha que he diseñado para evitarme los dolores de cabeza que me daban las demás.

Esta función, devuelve exactamente la última fila de cualquier hoja del libro que contiene algo en ella estemos o no en dicha hoja y sin necesidad de haber guardado los cambios.

Option Explicit
Public Function UltimaFila(Hoja As String) As Integer
On Error GoTo errores
UltimaFila = Sheets(Hoja).UsedRange.Row + Sheets(Hoja).UsedRange.Rows.Count - 1
Exit Function
errores:
UltimaFila = -1
End Function[/CODE]

Curiosamente, tras buscarla en google ya existía, pero tuve que crearla para luego buscarla y darme cuenta. Necesito perfeccionar mis búsquedas antes de reinventar la rueda.

Un saludo!

PD: La formula no es efectiva, la estoy mejorando para que haga lo que dice arriba ya que si se modifica el formato de cualquier fila ya sea tamaño de fila, negritas, o cualquier otra cosa, devuelve la fila de esa celda aun que esta esté vacia.

PD2: Vale, ahora parece que si que funciona mejor:

[CODE]Option Explicit
Public Function UltimaFila(Hoja As String) As Integer
On Error GoTo errores
Dim i As Integer:
Dim ActRow As Integer
Dim p As Range

i = Sheets(Hoja).UsedRange.Rows.Count
ActRow = Sheets(Hoja).UsedRange.Row

For Each p In Sheets(Hoja).UsedRange
If p.Row <> ActRow Then 'No se me ocurria ninguna otra forma de hacer step-1 usando contadores de objetos
ActRow = p.Row
i = i - 2
End If
If p(i).Value <> "" Then
UltimaFila = p(i).Row
Exit Function
End If
Next

Exit Function
errores:
UltimaFila = -1
End Function[/CODE]

Quizas algun romano quiera simplificarla un poco por que tiene que haber alguna manera de hacer step -1 con "for each" y tambien alguna manera de analizar de una tacada todo un rango para ver si tiene algun valor.

Un saludo y edito el primer mensaje con la segunda version.

UltimaFila.zip

UltimaFila v2.zip

publicado

Re: ¿Cual es el numero de la última fila con contenido de la Hoja X?

muy buena verzulsan

Esta nunca falla mi amigo:)

Sub ufo()
ufo = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
MsgBox ufo
End Sub
[/PHP]

Espero entender tu idea (que aunque se se trata de UDF)

Saludos

publicado

Re: ¿Cual es el numero de la última fila con contenido de la Hoja X?

Sub ufo()

ufo = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

MsgBox ufo

End Sub

Ja!,.... Hola amigo Gerson, increible, en una sola linea. Hace exactamente lo mismo que la mia.

La reemplazo por la mia y la mia al cajon de los trastos obsoletos

Un saludo y gracias :)

publicado

Re: ¿Cual es el numero de la última fila con contenido de la Hoja X?

No vayas a pensar que esa linea es mia, en los ultimos años se ha usado mucho, creo que una de las primeras apariciones fue en MrExcel del MVP Bill Jelen, y pues con ella se evitan otros metodos

A simple vista no es muy comprendida, pero es rapidisima, siempre te encontrara la ultima celda/fila ocupada

Public Function ultimafila() As Long
ultimafila = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
End Function[/PHP]

Saludos a todos

publicado

Hola a todos:

A simple vista no es muy comprendida, pero es rapidisima, siempre te encontrara la ultima celda/fila ocupada

Es cierto, y a día de hoy después de haber usado esta instrucción infinidad de veces, no entiendo como funciona.

Si alguien lo sabe, ¿Podría contarnoslo?.

Saludos.

publicado

Yo la entiendo mas o menos, el como funciona al menos, los entresijos (ni idea de como es el codigo fuente), lo extraño es que he usado este tipo de busqueda para otras cosas, pero que lo dejas aparcado para un futuro y luego se te olvida volver a tocar la funcion, la idea es sencillamente genial, una busqueda por el rango activo y devolver la fila del rango explorado donde encuentra coincidencias, y no solo sirve para encontrar la ultima fila con contenido, tambien puedes buscar por cualquier tipo de formato ya que lo que se está haciendo aqui realmente es usar el buscador de excel. Si grabas una macro con buscar o reemplazar, te sale algo similar a esto:

Cells.Find(What:="*", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate[/CODE]

Toqueteandolo un poco se pueden conseguir verdaderas virguerias, en la ayuda de Excel te pone la interfaz bastante desarrollada para saber que es cada cosa:

[size=2]expresión.Find(What' date=' After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

expresión Requerida. Expresión que devuelve un objeto Range .

What Variant requerida. La información que se busca. Puede ser una cadena de caracteres o cualquier tipo de datos de Microsoft Excel.

After Variant opcional. La celda después de la cual se desea buscar. Corresponde a la posición de la celda activa cuando se lleva a cabo una búsqueda desde la interfaz del usuario. Tenga en cuenta que After debe ser una sola celda del rango. Recuerde que la búsqueda empieza después de esta celda; no se buscará en la celda hasta que el método regrese a ella. Si no se especifica este argumento, la búsqueda se iniciará después de la celda de la esquina superior izquierda del rango.

LookIn Variant opcional. Tipo de información.

LookAt Variant opcional. Puede ser una de las siguientes constantes XlLookAt: xlWhole o xlPart.

SearchOrder Variant opcional. Puede ser una de las siguientes constantes XlSearchOrder: xlByRows o xlByColumns.

SearchDirection XlSearchDirection opcional. Dirección de la búsqueda.

XlSearchDirection puede ser una de estas constantes XlSearchDirection.

xlNext valor predeterminado

xlPrevious

MatchCase Variant opcional. True para que la búsqueda distinga entre mayúsculas y minúsculas. El valor predeterminado es False.

MatchByte Variant opcional. Se emplea únicamente en la versión para Lejano Oriente de Microsoft Excel. True para que los caracteres de dos bytes sólo coincidan con caracteres de dos bytes. False para que dichos caracteres coincidan con sus equivalentes de un solo byte.

SearchFormat Variant opcional. Formato de la búsqueda.

[/size']

No es una UDF, esto ultimo va para el moderador que ha cambiado el título del post.

Voy a hacer alguna paranoya para probar este "nuevo" sistema y luego vengo con los resultados si me sale algo interesante jeje, AVE CESAR! y Saludos Gerson

publicado

Ya la entiendo un pelin mejor, ahi os dejo la funcion de pruebas que hice explorando la funcion, lo que hace es encontrar todos los comentarios que pueda tener una hoja y muestra las direcciones de todas ellas.

Sub BuscarComentarios()
On Error GoTo FinDeFuncion
Dim s As String
Dim p As Range, q As Range
Set p = Cells.Find("*", [a1], -4144, 1, 1, 1, 1, 0, False)
Set q = p
Do
s = s & p.Address & ", "
Set p = Cells.Find("*", p, -4144, 1, 1, 1, 1, 0, False)
If q.Address = p.Address Then Exit Do
Loop
MsgBox "Hay Comentarios en: " & s
Exit Sub
FinDeFuncion:
MsgBox "No hay coincidencias"
End Sub[/CODE]

Seguro que Antoni consigue sacarle partido a esta funcioncita.

Saludos!

pruebas Find.zip

Invitado jorgetchake
publicado

Saludos Verzulsan

Muy buen trabajo.

Seguro que como todas las cosas hay que saber encontrarle una aplicación,… por las pruebas parece muy veloz,…. En particular yo no sabría como usarla porque no puedo encontrar literatura sobre el significado ni los valores que pueden tener sus parámetros,… y en tu ejemplo pones directamente el código que representa el valor del parámetro.

La ayuda Excel no me orienta sobre su uso.

Por ejemplo

LookIn Variant opcional. Tipo de información.[/CODE]

Que significa????? Cuáles son sus opciones???? En tu ejemplo creo has puesto -4144 ¡!!

Amigo,… toda ayuda será muy bien recibida y de paso me podrías decir que significa UDF.

Cordiales saludos.

publicado

Muy buenas jorgetchake,

Me alegro que te interese el tema, mientras mas cocos pensantes mas avance.

Que no le encuentres utilidad ahora mismo no importa, ya te "encontraras" con alguna situacion en la que le puedas sacar mucho partido, yo aun no la he usado salvo hoy y hace unos años cuando la descubrí usando el grabador de macros, ayer Gerson me la redescubrió con la genialidad de aplicarla para encontrar la última fila, bastante original la verdad.

en tu ejemplo pones directamente el código que representa el valor del parámetro.

Suelo hacerlo cuando hago pruebas, este valor lo puedes mirar tu mismo con el explorador de objetos o usando Inmediato (en las opciones de VBA). Un truquito que yo usaba cuando empezaba a probar funciones es, borrar una coma de la funcion y luego ponerla, en ese momento te aparece una imagen que te muestra en negrita lo que debes poner, quizas te ayude si estas empezando.

La ayuda Excel no me orienta sobre su uso.

LookIn Variant opcional. Tipo de información.[/CODE]

Que significa????? Cuáles son sus opciones???? En tu ejemplo creo has puesto -4144 ¡!!

Como dije, solo son pruebas de macros, no tengo ni idea del alcance del rango de numeros que se le pueden asignar a la variable LookIn, pero si vas al cuadro de busqueda de excel, veras que en el menu de "Buscar dentro de" te aparecen 3 opciones que si las grabas, en el codigo sale:

xlFormulas -4123 (Buscará solo en el contenido de las formulas)

xlValues -4163 (Buscará solo en los valores de las celdas)

xlComments -4144 (Buscará solo en el contenido de los comentarios)

me podrías decir que significa UDF.

No soy un experto en el tema, pero son funciones definidas por el usuario que actuan como formulas del excel una vez que han sido incorporadas al excel. Estan hechas de codigo VB y luego las puedes utilizar como cuando utilizas "=izquierda(A1;5)", miraté este articulo que aqui lo explican mas extensamente: UDF

Actualmente ya no dispongo de tanto tiempo como antes, por lo que no podré aventurarme a explorar y exprimir esta funcion, pero el foro está lleno de "makinas" como yo los llamo o Romanos como se hacen llamar que de seguro van a explotar esta funcion y sacar excelentes aportes, por lo que no te preocupes si algo no se entiende, por que si ese algo es interesante, los gladiadores saldran a la arena a lucharr. AVE CESAR.

Un saludo!

publicado

Hola

Aprovecho para saludar a los masters.

El uso del comodin * aunado a la parametro SearchDirection:=xlPrevious permite que excel comience a buscar a partir del final del rango de ahi que se obtiene el efecto esperado, al igual que el master gerson el ejemplo lo vi en la misma página de ayuda de MS Excel en inglés.

Tambien excel permite ir a la ultima celda ocupada usada, sin embargo es necesario primero limpiar el rango para que funcione adecuadamente.

Public Function UltimaFila(Hoja As String) As Long

With Sheets(Hoja)

.UsedRange

UltimaFila = .Cells.SpecialCells(xlCellTypeLastCell).Row

End With

End Function

saludos

publicado

Hola master never.

Lo que dices es cierto por que efectivamente ocurre así si se ponen esos parametros. La razon por la que busca desde el final del rango es por que no se ha especificado el valor After "buscar despues de", y segun la interfaz, si no se especifica, busca desde la celda arriba izquierda del rango:

After Variant opcional. La celda después de la cual se desea buscar. Corresponde a la posición de la celda activa cuando se lleva a cabo una búsqueda desde la interfaz del usuario. Tenga en cuenta que After debe ser una sola celda del rango. Recuerde que la búsqueda empieza después de esta celda; no se buscará en la celda hasta que el método regrese a ella. Si no se especifica este argumento, la búsqueda se iniciará después de la celda de la esquina superior izquierda del rango.

El caracter * busca cualquier coincidencia del tipo seleccionado, y como no se ha seleccionado ningun tipo entonces busca por valor de celda que es por defecto. Arriba puse los valores:

xlFormulas -4123 (Buscará solo en el contenido de las formulas)

xlValues -4163 (Buscará solo en los valores de las celdas)

xlComments -4144 (Buscará solo en el contenido de los comentarios)

Y el rango donde busca, tambien está omitido, por lo que coge el UsedRange, pero si te creas un rango personalizado, buscará solo en ese rango.

Un saludo amigo

publicado

Re: ¿Cual es el numero de la última fila con contenido de la Hoja X?

...pero es rapidisima, siempre te encontrara la ultima celda/fila ocupada......Saludos a todos

pues creo que aun se trata de una UDF 'generica' y es cuestion de lo que se desee!!!!

probando 'rapidamente' con esta version parace que cumple el trabajo,no medi la rapidez,ni relice ningun otro tipo depruebas....que dejo a los interesados :o

Public Function UltimaFila_ST() As Long
Application.Volatile: UltimaFila_ST = ActiveSheet.UsedRange.Rows.Count
End Function[/CODE]

publicado

Hola master ST, me da mucho gusto verde por aca devuelta.

El problema de usar ActiveSheet.UsedRange.Rows.Count es que funciona bien siempre y cuando todas las filas tengan datos, ya que precisamente regresa el rango usado de la hoja si por ejemplo comenzamos a escribir en la celda A5 y teminamos en la celda A8 la funcion devolvera 4 que son las celdas usadas, tambien es necesario limpiar el rango usado de la hoja con la instruccion ActiveSheet.UsedRange

saludos

  • 2 weeks later...
publicado

ciertamente ya que solo pretendia ser una variante de lo ofertado :)

pero de cara a lo que comentas,creo que seguiremos prefiriendo la de nuestro amigo el catracho "Gerson Pineda"

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.