/ / ¿Es posible usar FindPrevious cuando se busca con código VBA en un UDF? - excel, vba, excel-vba, funciones definidas por el usuario, udf

¿Es posible usar FindPrevious cuando se busca con un código VBA en un UDF? - excel, vba, excel-vba, funciones definidas por el usuario, udf

Estoy tratando de usar VBA para un UDF para manipular sus resultados en función de la función "Buscar", ya que es mucho más rápido que sondear cada celda en busca de resultados.

Lo volví a lo básico para reproducir el error y todavía aparece el error "Variable de objeto o Con variable de bloque no establecida" en esta parte SearchRange.FindPrevious.Address (Debe detener la línea y presionarla para obtener el error, UDF simplemente se cierra sin devolver el error fuera del modo de depuración)

Aquí está la patada, recibo el error cuando intento usar el UDF en una hoja así: =testfind("3206-1",E:E) Sin embargo, cuando lo uso en la ventana inmediata en el VBE así: ?testfind("3206-1",Range("E:E")) obtengo el resultado correcto de $E$15295 sin error.

El código es:

Function TestFind(FindString As String, SearchRange As Range)
Dim ActiveAddress As Range
Set ActiveAddress = SearchRange.Find(FindString)
TestFind = SearchRange.FindPrevious.Address
End Function

Modificado con los cambios de L42 y ahora funciona:

Function TestFind(FindString As String, SearchRange As Range)
Dim ActiveAddress As Range
Set ActiveAddress = SearchRange.Find(FindString)
TestFind = SearchRange.Find(FindString, , , , , xlPrevious).Address
End Function

Respuestas

1 para la respuesta № 1

Edit1:

Este código

TestFind = SearchRange.FindPrevious.Address

y esto como se sugirió anteriormente:

TestFind = SearchRange.FindPrevious(ActiveAddress).Address

no funciona cuando lo usas como una hoja de cálculo como lo que Dan experimentó.
A continuación no responde directamente la pregunta, sino solo una alternativa.

Alternativa: Cambiar el SearchDirection argumento en el Find método.

Function TestFind2(FindString As String, SearchRange As Range)
Dim ActiveAddress As Range
Set ActiveAddress = SearchRange.Find(FindString, , , , , xlPrevious)
TestFind2 = ActiveAddress.Address
End Function

Nota: debe agregar un controlador de errores para atrapar las búsquedas sin encontrar coincidencias.

Cómo probar:

Sub marine()
Debug.Print TestFind(4, [A:A])
End Sub